我遇到了this T.C.'s amazing answer( edit:我认为现在是错误的),并有一个后续问题。请考虑以下代码,在该代码中,我使用在全局命名空间范围中声明的整数类型的constantly initialized常量变量来不断初始化类的常量静态数据成员或声明数组数据成员。更好说明的示例:
const int internal_linkage_constant = 1;
class ExternalLinkageClass
{
static const int constexpr_value = internal_linkage_constant; // #1
int arr[internal_linkage_constant]; // #2
};
所有这些类的定义都在头文件中,并且可能在多个翻译单元之间共享。必须在这些定义之前定义全局常数,并且全局常数本身不能具有外部链接才能在constant expressions中使用。 现在我的问题是:由于违反ODR,这种初始化会导致不确定的行为吗?
答案 0 :(得分:2)
没有例外。 C ++ 98标准在3.2章中指出:
一个类类型可以有多个定义,(...) 程序,前提是每个定义都以不同的方式出现 翻译单元,并提供满足以下条件的定义 要求:
- D的每个定义应包含相同的令牌序列;和
- 在D的每个定义中,按照3.4查找的相应名称应指代D定义中定义的实体, 或应在重载解决方案(13.3)之后引用同一实体 并且匹配部分模板专业化(14.8.3)之后,除外 名称可以引用具有内部链接或不具有链接的const对象,如果 该对象在所有对象中具有相同的整数或枚举类型 D的定义,并且用常量初始化对象 表达式(5.19)和对象的值(而不是地址) 使用,并且该对象在D的所有定义中具有相同的值;
- (...)