如果我们有一个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),除了如果对象在 D 的所有定义中具有相同的文字类型,并且该对象使用常量表达式 (5.19) 初始化,则名称可以引用具有内部链接或没有链接的非易失性 const 对象,并且该对象不是 ODR 使用的,并且该对象在 D 的所有定义中具有相同的值