【发布时间】:2016-12-14 01:21:53
【问题描述】:
查看another question 我意识到我不能通过头文件使用来自匿名命名空间的对象或函数,因为它会导致类定义或内联函数中的 ODR 冲突。如果是这种情况,那么是否可以在 inline 函数或类中安全地使用命名为 const 或 constexpr static 的对象?例如,如果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++17 中这不再是问题。奇怪的是,类型别名可以解决您的问题:
using CONSTANT = std::integral_constant<int, 2>; -
@Barry 从 M.M 的引用中删除了我收集的 C++17 中的“对象未被使用”?
-
N4606(这是根据 isocpp.org 的最新标准草案)仍然有“对象未使用 odr”
-
@M.M 对不起,我一开始以为会这样……等待巴里的回应
-
@RyanHaining N4606 的日期在该文档之后,并且该文档和 N4606 之间的某些文本有所不同,因此我们需要小心
标签: c++ c++11 one-definition-rule