문제

C++에서는 자유 객체의 초기화 순서가 정의되지 않습니다.그러나 다음은 어떻습니까?

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

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

그 외에도:str이 "char const[]" 유형이라면 어떻게 될까요?그리고 그것이 std::string이라면?

도움이 되었습니까?

해결책 2

초기화 순서는 정의됩니다. 컴파일 단위에 나타나는 순서대로 초기화됩니다. C++ 표준의 섹션 3.6.2를 참조하세요.초기화되는 항목의 유형은 효과가 없습니다.

다른 팁

서로 다른 번역 단위에 위치하더라도 초기화 순서는 여전히 정의됩니다.

그 이유는 str 상수 표현식으로 초기화됩니다(address constant expression) 그리고 str 포드 유형이 있습니다.배열이 있으면 여전히 유효합니다.하지만 만약 당신이 가지고 있다면 그것은 더 이상 사실이 아닐 것입니다. std::string.동적으로 초기화됩니다(왜냐하면 std::string 비 POD입니다).

따라서 귀하의 경우 str 이었다 std::string, 다음과 같은 경우 정의되지 않은 동작이 발생하게 됩니다. obj 다른 번역 단위로 정의되어 있지만 귀하가 나열한 것 중 문제를 일으킬 수 있는 유일한 경우입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top