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

Rya*_*ing 3 c++ one-definition-rule c++11

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

// 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;
};
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 5

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

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

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

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

"它不是使用过的 "这一点应该是指"它不是在内部使用f() " - 即f()如果你碰巧在程序的其他地方使用odr,它就不会破坏CONSTANT.