对 Static Const Int 的未定义引用:解决方案
在最近的编程场景中,出现了编译错误,并显示消息“对静态常量的未定义引用” '酒吧::kConst'”。该错误源自以下代码片段:
class Bar { public: static const int kConst = 1; void func() { foo(kConst); // Error-prone line } };
出现该错误是因为静态常量成员“kConst”未定义。通常,编译器应该在编译时进行必要的替换。然而,在这种情况下,函数“foo”采用“const int &”参数,导致编译器更倾向于引用而不是替换。
要解决此问题,可以采用以下修改:
foo(static_cast<int>(kConst));
此方法强制编译器创建一个临时“int”并传递对其的引用,从而允许成功编译。
观察到的行为是有意的,如 C 标准中所指定的( 9.4.2/4),其中规定当常量整型类型的静态数据成员具有常量初始值设定项时,它可以出现在整型常量表达式中。但是,如果在程序中使用,它仍然必须在命名空间范围内定义。
在给定的代码中,根据 C 标准 (3.2/2),通过常量引用传递静态数据成员构成“使用”。这意味着编译器有义务强制存在“kConst”定义。
虽然 GCC 有时可能在某些情况下忽略此要求,但通常建议遵守标准并避免使用引用发送或获取不存在对象的地址。
以上是为什么通过引用传递静态常量 Int 会导致 C 中的'未定义引用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!