【问题标题】:Initialisation of static variable with itself用自身初始化静态变量
【发布时间】:2014-04-10 14:51:20
【问题描述】:

考虑以下代码示例:

#include <iostream>

static int bar = bar;

int main()
{
    int foo = foo;
    std::cout << "foo = " << foo << std::endl;
    std::cout << "bar = " << bar << std::endl;
}

我收到以下编译器警告:

main.cpp: In function 'int main()':
main.cpp:7:15: warning: 'foo' is used uninitialized in this function [-Wuninitialized]
     int foo = foo;
               ^

输出:

foo = 0
bar = 0

我预计会出现此警告,因为 foo 已被统一使用。 'foo' 可以是任何东西,而不是 0。 自分配是未定义的。

但是为什么'bar'的自赋值没有被警告呢?这个“bar”的分配是定义的还是未定义的行为?为什么?

我知道,基本数据类型的静态变量用“0”初始化,但在这种情况下,变量“bar”在其初始化期间使用。我想知道,如果这是定义的行为并且“0”是预期的输出。 (这可以解释,没有发生编译器警告)。

Link to Live example

【问题讨论】:

  • 静态初始化不止一个阶段。
  • 可能是因为全局范围内的静态变量总是初始化为零,所以编译器在赋值之前就知道bar实际上是0
  • @FrédéricHamidi:请注意,它们不是零初始化的,而是默认构造的。这对结构/类有影响!
  • @anderas,真的,我应该说静态 primitives :)
  • @anderas AFAIK,static-storage-duration 事物在任何其他初始化发生之前被初始化为零,包括以后可能执行的默认 ctor。

标签: c++


【解决方案1】:

我相信部分标准与您的问题相关(§3.6.2/2):

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

所以在这种情况下,甚至在编译器查看您对bar 的定义之前,它就已经对其进行了零初始化。

由于标准中进一步规定,静态变量初始化应分为两个阶段(强调我的)。

零初始化和常量初始化合称为静态初始化;所有其他初始化 是动态初始化静态初始化应在任何动态初始化发生之前进行

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2010-12-22
    • 2015-12-09
    • 2017-05-13
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多