【发布时间】:2014-05-24 03:26:08
【问题描述】:
我有一个与之前发布的问题相关的问题Static field initialization order
假设我有以下结构,有 2 个静态成员 x 和 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;
}
输出:
x = 1.1
y = 2.2
我在main()上面初始化了x和y,可以看到y依赖于x,所以最好先初始化x。
我的问题:
- 在初始化的时候,
x和y的类型还是未知的,那么它们是什么时候真正初始化的呢?main()中的模板实例化Foo<double> foo;后,静态成员是否真的被初始化了? - 如果是,
x和y的声明顺序似乎无关紧要,即我可以先声明y然后x(在结构和静态初始化中)并且仍然得到正确的输出,即编译器以某种方式知道y依赖于x。这是一个定义明确的行为(即符合标准)吗?我在 OS X 上使用 g++ 4.8 和 clang++。
谢谢!
【问题讨论】:
-
我删除了我的答案,您可能需要更多标准知识的人,对不起!
-
@user657267 没问题,其实我对答案非常好奇,因为我在任何地方都找不到满意的答案。
标签: c++ templates static static-members