У меня есть вопрос, связанный с предыдущим вопросом, размещенным здесь Порядок инициализации статического поля Предположим, у меня есть следующая структура с 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
Я инициализирую x
и y
выше main()
, и вы можете видеть, что y
зависит от x
, поэтому лучше сначала инициализировать x
.
Мои вопросы:
- В момент инициализации типы
x
иy
еще неизвестны, так когда же они действительно инициализируются? Действительно ли статические члены инициализируются после создания экземпляра шаблонаFoo<double> foo;
вmain()
? - И если да, то порядок объявлений
x
иy
, кажется, не имеет значения, т.е. я могу сначала объявитьy
, затемx
(как в структуре, так и в статической инициализации) и все равно получить правильный результат, т.е. компилятор каким-то образом знает, чтоy
зависит отx
. Это четко определенное поведение (т.е. соответствует стандартам)? Я использую g ++ 4.8 и clang ++ в OS X.
Спасибо!