【发布时间】:2013-06-17 00:26:41
【问题描述】:
如果我们有一个头文件widget.hpp,内容如下:
constexpr int foo = 10;
struct widget
{
int bars[foo];
};
...我们从两个源文件生成了两个翻译单元,它们都只包含widget.hpp,这是否违反了一个定义规则(更具体地说,使用foo 是否违反了一个定义规则)?
foo 具有内部链接,但它也是一个常量表达式。根据我对 C++11 标准中 3.2.6 的阅读(我将在下面引用),如果要求 #2 不仅仅指静态数据成员,则这是格式良好的。
3.2.6 要求 #2:
在D的每一个定义中,对应的名字,根据 3.4,应指在 D 的定义中定义的实体,或应指同一实体,在重载决议 (13.3) 和 在匹配部分模板特化 (14.8.3) 之后,except 名称可以引用具有内部或 如果对象在所有定义中具有相同的文字类型,则没有链接 的 D,并且对象用常量表达式(5.19)初始化, 并且该对象不是 odr-used,并且该对象在 D的所有定义
【问题讨论】:
标签: c++ c++11 constexpr one-definition-rule