我有一个与此处发布的上一个问题相关的问题静态字段初始化顺序假设我有以下结构,有 2 个静态成员x
and y
(模板类型本身)
#include <iostream>
using namespace std;
template <typename T>
struct Foo
{
static T x;
static T y;
Foo()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
};
template <typename T>
T Foo<T>::x = 1.1f;
template <typename T>
T Foo<T>::y = 2.0 * Foo<T>::x;
int main()
{
Foo<double> foo;
}
Output:
x = 1.1
y = 2.2
我初始化x
and y
above main()
,你可以看到y
依赖于取决于x
,所以最好是这样x
首先被初始化。
我的问题:
- 在初始化时,类型
x
and y
仍然未知,那么它们什么时候真正初始化呢?静态成员是否在模板实例化后实际初始化Foo<double> foo;
in main()
?
- 如果是,则声明的顺序
x
and y
似乎并不重要,即我可以先声明y
then x
(在结构体和静态初始化中)并且仍然得到正确的输出,即编译器以某种方式知道y
取决于x
。这是一个明确定义的行为(即符合标准)吗?我在 OS X 上使用 g++ 4.8 和 clang++。
Thanks!
这段代码是安全的,因为Foo<double>::x
具有恒定的初始化,但是Foo<double>::y
具有动态初始化。
3.6.2/2:
常量初始化执行:
零初始化和常量初始化一起称为静态初始化;所有其他初始化是动态初始化。静态初始化应在任何动态初始化发生之前执行。
另一方面,如果您有:
double tmp = 1.1;
template <typename T>
T Foo<T>::x = tmp;
template <typename T>
T Foo<T>::y = 2.0 * Foo<T>::x;
该代码不会“安全” -Foo<double>::y
最终可能是2.2
or 0.0
(假设没有其他改变tmp
在动态初始化期间)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)