Rya*_*ing 3 c++ one-definition-rule c++11
看看另一个问题,我意识到我不能通过头文件使用匿名命名空间中的对象或函数,因为它会在类定义或内联函数中导致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;
};
Run Code Online (Sandbox Code Playgroud)
这段代码没问题.完整段落(C++ 14 [basic.def.odr/6.2])是:
在每个定义中
D,相应的名称,根据3.4查找,应指在定义中定义的D实体,或者在重载解析后和部分模板专业化匹配后应引用同一实体,但名称可以参考如果对象在所有定义中具有相同的文字类型D,并且使用常量表达式初始化对象,并且对象没有使用odr,并且对象具有相同的对象,则具有内部链接或无链接的非易失性const对象所有定义中的价值D; 和
此用法符合"除......和...和..."部分中的所有条件:
CONSTANT实际上是指const具有内部链接的非易失性对象f().2.f()."它不是使用过的 "这一点应该是指"它不是在内部使用f() " - 即f()如果你碰巧在程序的其他地方使用 了odr,它就不会破坏CONSTANT.
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |