首页 >后端开发 >C++ >为什么通过引用传递静态常量 Int 会导致 C 中的'未定义引用”错误?

为什么通过引用传递静态常量 Int 会导致 C 中的'未定义引用”错误?

Linda Hamilton
Linda Hamilton原创
2024-10-29 19:02:02728浏览

Why Does Passing a Static Const Int by Reference Cause an

对 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn