정적 초기화 시 무료 "char const*" 사용
-
16-09-2019 - |
문제
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
다른 번역 단위로 정의되어 있지만 귀하가 나열한 것 중 문제를 일으킬 수 있는 유일한 경우입니다.
제휴하지 않습니다 StackOverflow