템플릿 클래스의 정적 멤버 초기화 복잡성
C에서 정적 멤버 초기화는 널리 사용되는 기술이지만 처리할 때 복잡해질 수 있습니다. 템플릿 클래스. 템플릿이 아닌 클래스에서는 중첩된 도우미 구조체를 초기화에 사용할 수 있지만 바깥쪽 클래스가 템플릿일 때는 이 접근 방식이 부족합니다.
다음의 간단한 예를 고려하세요.
<code class="cpp">struct A { static std::string mA; static InitHelper mInit; static const std::string& getA() { return mA; } }; std::string A::mA; A::InitHelper A::mInit; template<class T> struct B { static std::string mB; static InitHelper mInit; static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } }; template<class T> std::string B<T>::mB; template<class T> typename B<T>::InitHelper B<T>::mInit; int main() { std::cout << "A = " << A::getA() << std::endl; // Comment/uncomment lines to observe different behaviors // std::cout << "B = " << B<int>::getB() << std::endl; // [1] // B<int>::getHelper(); // [2] }</code>
예상 동작:
[1]이 주석 처리되지 않고 [2]가 주석 처리되면 B
실제 동작:
불일치 이유:
ISO/IEC C 2003 표준에 따르면 템플릿 멤버는 정의가 필요한 컨텍스트에서 참조될 때 암시적으로 인스턴스화됩니다. 존재하다. 그러나 정적 데이터 멤버 초기화(및 관련 부작용)는 정적 데이터 멤버가 명시적으로 사용되는 경우에만 발생합니다. 즉, 템플릿 멤버가 인스턴스화되지 않은 템플릿이나 전체 인스턴스화가 필요하지 않은 다른 컨텍스트에서만 참조되는 경우 해당 정적 데이터 멤버는 초기화되지 않습니다.
예제에서 B
해결책:
표준에서는 명시적으로 특수화된 클래스 템플릿 정적 데이터 멤버의 정의가 초기화 순서를 갖는 반면 다른 클래스 템플릿 정적 데이터 멤버의 정의는 순서 없는 초기화를 갖는 것을 금지합니다. 일관된 초기화 순서를 보장하려면 명시적인 특수화를 사용해야 합니다.
위 내용은 템플릿 클래스의 정적 멤버 초기화가 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!