【发布时间】:2015-06-01 11:18:20
【问题描述】:
1) 如果我没记错的话,C++ 标准保证单个翻译单元中的静态变量按其定义顺序进行初始化。我对以下代码片段感到困惑:
extern int n;
int k = n;
int n = 2;
extern int n;是声明,不是定义,所以k是在n之前定义的,但是GCC、Clang和MSVC都告诉我k == 2是在全局变量初始化之后。对我来说,不清楚如何在int k = n; 之后为k 分配2,因为n 那时还没有初始化,它的值必须为零。
如果我们把最后一行改成:
int n = func();
如果func() 是非常量表达式,那么k 将被赋值为零,正如我所料。那么,编译时初始化全局变量会改变初始化的顺序吗?
2) 这是另一个代码片段:
class Base
{
public:
struct static_constructor
{
static_constructor()
{
i = 1;
}
};
static static_constructor constructor;
static int i;
};
Base::static_constructor Base::constructor;
int Base::i = 2;
当Base::constructor被定义时,它的构造函数被调用,并且i = 1被赋值。但是此时Base::i还没有定义,所以,请你解释一下此时发生了什么,为什么Base::i最后等于1?
【问题讨论】:
-
在这两种情况下,
= 2都是编译时常量,根本不会在运行时执行。如果您将= 2替换为=f(2),其中f不是const-expr,那么我希望运行时初始化按照您期望的顺序进行。
标签: c++ initialization global-variables static-members static-variables