2009-04-26 6 views
1

C++에서는 여유 오브젝트의 초기화 순서가 정의되지 않습니다. 그러나 다음은 어떨까요?정적 초기화시 free "char const *"사용

namespace foo { 
    char const* str = "hey"; 
    struct A { 
     A() { cout << str; } 
    } obj; 
} 

아직 정의되지 않은 동작입니까, 아니면 문자열 리터럴로 초기화 된 포인터에 대한 특수 조항이 있습니까?

그 외에도 : str이 "char const []"유형 인 경우 어떻게해야합니까? 그리고 그것이 std :: string이라면?

답변

3

컴파일 순서에 따라 초기화 순서가 정의됩니다 (C++ 표준 3.6.2 절 참조). 초기화되는 항목의 유형은 효과가 없습니다.

+0

내 잘못 알겠습니다. –

+1

-1 : 잘못되었습니다. http://stackoverflow.com/questions/8750407/do-objects-of-built-in-types-have-special-static-initialisation-order-precedence를 참조하십시오. –

5

번역 단위가 다른 경우에도 초기화 순서는 계속 정의됩니다.

이는 str이 상수 표현식 (address constant expression)으로 초기화되고 str이 pod 유형을 갖기 때문입니다. 배열이 있다면 여전히 유효합니다. 그러나 std::string이 있다면 더 이상 사실이 아닙니다. 이들은 동적으로 초기화됩니다 (std::string은 POD가 아니기 때문에). 당신의 strstd::string 인 경우

따라서, obj이 다른 번역 단위에 정의되어있는 경우 당신은 정의되지 않은 동작으로 실행됩니다,하지만 당신이 그 문제를 일으킬 것 나열된 하나의 유일한 경우입니다.