静态const成员变量的初始化基于彼此

时间:2014-02-25 17:09:50

标签: c++ c++11

在这里初始化B和C时,假设A被初始化为1是否安全?

struct Test {
  static const int A = 1;
  static const int B = A + 1;
  static const int C = B + 1;
};

int main() {
  printf("%i %i %i\n", Test::A, Test::B, Test::C);  ==> 1 2 3
}

非整数静态成员

怎么样?
struct Test2 {
  constexpr static const Test A = Test();
  constexpr static const Test B = A;
  constexpr static const Test C = B;
};

clang -Wall不发出任何警告。

3 个答案:

答案 0 :(得分:3)

它们将在给定的翻译单元中以定义的顺序初始化,并且在任何其他对象或变量之前。

答案 1 :(得分:2)

也许。在这种情况下,A的初始化是静态的,所以 A可以用作整数常量表达式。然后呢 传播到B。当你宣布成员时,他们将是 静态初始化,编译器已评估的内容(即 在程序开始之前,01)。

如果他们没有静态初始化(这只是合法的 C ++ 11),无论出于何种原因,它们都将被初始化 按顺序,定义出现在源文件中,如果它们 在同一个源文件中定义。如果他们没有定义 相同的源文件,然后它们被初始化的顺序是 不确定的。

关于你的第二个例子:如果他们真的是constexpr, 仍然只涉及不断的表达,所以 一切都将在编译时决定,成员们将会 静态初始化。

答案 2 :(得分:0)

是。具有静态存储持续时间的对象在其他任何内容之前始终为零初始化:

  

具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量在进行任何其他初始化之前应进行零初始化(8.5)。

[3.6.2§2]

因此,任何常量或动态初始化都可以假设具有静态存储持续时间的所有其他对象至少为零初始化。

请注意, not 除了零初始化之外的其他任何内容都不提供任何保证!