通过全局常量初始化静态数据成员是否会导致未定义的行为?

时间:2019-03-06 08:05:54

标签: c++ undefined-behavior linkage c++98

我遇到了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,这种初始化会导致不确定的行为吗?

1 个答案:

答案 0 :(得分:2)

没有例外。 C ++ 98标准在3.2章中指出:

  

一个类类型可以有多个定义,(...)   程序,前提是每个定义都以不同的方式出现   翻译单元,并提供满足以下条件的定义   要求:

     
      
  • D的每个定义应包含相同的令牌序列;和
  •   
  • 在D的每个定义中,按照3.4查找的相应名称应指代D定义中定义的实体,   或应在重载解决方案(13.3)之后引用同一实体   并且匹配部分模板专业化(14.8.3)之后,除外   名称可以引用具有内部链接或不具有链接的const对象,如果   该对象在所有对象中具有相同的整数或枚举类型   D的定义,并且用常量初始化对象   表达式(5.19)和对象的值(而不是地址)   使用,并且该对象在D的所有定义中具有相同的值;
  •   
  • (...)
  •