2013-09-16 5 views
3

다음과 같은 경우는 어떻습니까? 의존성이있는 경우 컴파일러가 정적 변수의 초기화 순서를 올바르게 처리 할 수 ​​있습니까?컴파일러는 정적 변수의 초기화 순서를 올바르게 처리 할 수 ​​있습니까?

a.h

template<class T> 
struct A { static double a; }; 

template<class T> 
double A<T>::a = 1; 

b.h

struct B { static double b; }; 

b.cpp 당신의 예에서

#include "b.h" 
#include "a.h" 

double B::b = A<int>::a; 
+1

http://stackoverflow.com/a/1421736/2718447 – anjruu

+0

또한 : http://stackoverflow.com/questions/211237/static-variables-initialisation-order이 경우 – anjruu

+1

는'이후로 문제가 없습니다 a'는 정적으로 초기화됩니다. 아마도 둘 다 동적 초기화가 필요한보다 일반적인 경우에 대해 묻고 있습니까? –

답변

1

A<int>::a 정적 초기화되고, 모든 정적 초기화는 동적 초기화하기 전에 일어난다. B::b은 동적으로 초기화되므로 A<int>::a이 초기화되고 모든 것이 정상적으로 처리됩니다.

5

a이 정적으로 초기화되므로이 경우 아무런 문제가 없습니다. 이것은 b의 동적 초기화 전에 발생할 수 있습니다.

더 일반적으로 동적 초기화가 필요한 경우이 입니다. b 초기화에 템플릿 멤버를 사용하기 전에 템플릿 멤버를 전문으로하지 않는 한 보증 된 순서는 없습니다. 초기화을 주문한 명시 적으로 전문 클래스 템플릿 정적 데이터 멤버의

정의 : 표준 (C++ 11 3.6.2/2)를 인용합니다. 다른 클래스 템플릿 정적 데이터 멤버 (즉, 암시 적으로 또는 명시 적으로 인스턴스화 된 특수화)는 의 순서가 지정되지 않은 초기화을가집니다.