在头文件中使用符合 ODR 的常量

2023-12-01

看着另一个问题我意识到我不能通过头文件使用匿名命名空间中的对象或函数,因为这会导致类定义或内联函数中的 ODR 违规。如果是这种情况,那么是否可以使用命名const or constexpr static对象在inline功能还是安全地在课堂上?例如,如果CONSTANT是在里面namespace下面是不安全的,但是使用静态链接常量可以吗?

// some header file to be included by multiple .cpp files
static const/*expr*/ int CONSTANT = 2;

inline int f() {
  return CONSTANT;
}

class Cls {
  int mem = CONSTANT;
};

这段代码没问题。完整段落(C++14 [basic.def.odr/6.2])是:

在每个定义中D,根据 3.4 查找的相应名称应指代定义中定义的实体D,或在重载解析之后和部分模板特化匹配之后应引用相同的实体,但名称可以引用非易失性 如果对象在所有定义中具有相同的文字类型,则具有内部链接或无链接的 const 对象D,并且该对象是用常量表达式初始化的,并且该对象不是odr-used,并且该对象在所有定义中具有相同的值D; and

此用法确实匹配“除了...和...和...”部分中的所有条件:

  • 名字CONSTANT实际上指的是非易失性const具有内部链接的对象
  • 它在所有定义中具有相同的文字类型f().
  • 它是用常量表达式初始化的2.
  • 它不是odr-used.
  • 它在所有定义中具有相同的值f().

要点“这不是odr-used” 的意思应该是“这不是odr-used within f()“——即它不会破裂f()如果你碰巧odr-use CONSTANT程序中的其他地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在头文件中使用符合 ODR 的常量 的相关文章

随机推荐