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

时间:2016-12-14 01:21:53

标签: c++ c++11 one-definition-rule

查看another question我意识到我无法通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致ODR违规。如果是这种情况,那么是否可以在const函数或类中安全地使用命名的constexprstatic 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;
};

1 个答案:

答案 0 :(得分:5)

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

  

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

此用法符合“除......和...和...”部分中的所有条件:

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

点“它不是 odr-used ”应该是指“f()中没有 odr-used ” - 即它没有如果您碰巧在程序的其他位置 odr-use f(),请暂停CONSTANT