查看another question我意识到我无法通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致ODR违规。如果是这种情况,那么是否可以在const
函数或类中安全地使用命名的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;
};
答案 0 :(得分:5)
这段代码没问题。完整段落(C ++ 14 [basic.def.odr / 6.2])是:
在
D
的每个定义中,根据3.4查找的相应名称,应指代D
定义中定义的实体,或者在重载解析后引用同一实体,在匹配部分模板专门化之后,除了名称可以引用非易失性 如果对象在D
的所有定义中具有相同的文字类型,并且该对象使用常量表达式初始化,并且该对象不是 odr-used ,则具有内部链接或无链接的const对象,该对象在D
的所有定义中具有相同的值;和
此用法符合“除......和...和...”部分中的所有条件:
CONSTANT
实际上是指具有内部链接的非易失性const
对象f()
的所有定义中,它具有相同的文字类型。2
初始化它。 f()
的所有定义中具有相同的值。点“它不是 odr-used ”应该是指“f()
中没有 odr-used ” - 即它没有如果您碰巧在程序的其他位置 odr-use f()
,请暂停CONSTANT
。