C++에서 모든 경우에 false로 초기화되는 새로운 bool에 의존 할 수 있습니까?새 bool이 false로 초기화되도록 할 수 있습니까?
bool *myBool = new bool();
assert(false == *myBool); // Always the case in a proper C++ implementation?
(업데이트 코드는 의견을 반영합니다.)
C++에서 모든 경우에 false로 초기화되는 새로운 bool에 의존 할 수 있습니까?새 bool이 false로 초기화되도록 할 수 있습니까?
bool *myBool = new bool();
assert(false == *myBool); // Always the case in a proper C++ implementation?
(업데이트 코드는 의견을 반영합니다.)
이 경우 예; 그 이유는 아주 미묘합니다.
new bool()
의 괄호는 값 초기화으로, false
으로 초기화합니다. 그것들이 없으면 new bool
은 default-initialisation을으로 지정하며,이 값은 지정되지 않은 값으로 남습니다.
가능한 경우 개인적으로 가능한 한 new bool(false)
을보고 초기화해야한다고 분명히 말합니다.
(이는 new
을 사용하는 데는 충분한 이유가 있다고 가정합니다. 스마트 포인터로 관리해야하지만,이 질문의 범위를 벗어납니다.)
참고 :이 질문은 내가 읽었을 때의 대답입니다. 그것은 다른 대답이 쓰여진 후에 그 의미를 바꾸기 위해 편집되었다.
번호 C에는 자동으로 초기화가 없다 ++. 새로운 bool은 그 순간에 메모리에 있던 것으로 초기화되며, 사실이 될 가능성이 높습니다 (0이 아닌 값이 모두 true이기 때문에). 그러나 아무런 보장도 없습니다.
당신과 잘 어울리는 컴파일러를 사용하고 항상 새로운 부울에 거짓 값을 할당하는 컴파일러를 사용할 수는 있지만 컴파일러에 따라 다르며 모든 언어 표준을 기반으로하지는 않습니다.
항상 변수를 초기화해야합니다.
bool이 false로 초기화되고 bool이 불확정 값을 가지며 bool이 다음과 같이 bool이 초기화된다는 것을 의미하는 bool의 초기화, 0 초기화, 기본값 초기화 및 값 초기화의 세 가지 관련 종류가 각각 있습니다. false로 초기화됩니다.
따라서 제로 또는 값 초기화가 필요합니다. 자동 또는 동적 저장 기간을 가진 객체가 초기화 프로그램을 지정하지 않고 초기화되는 경우 기본 초기화가 수행됩니다. 값 초기화를 얻으려면 빈 이니셜 라이저 ()
또는 {}
이 필요합니다.
bool b{}; // b is value-initialized
bool *b2 = new bool{}; // *b2 is value-initialized
class foo {
bool b;
foo() : b() {}
};
foo f; // // f.b is value-initialized
당신은 정적 또는 스레드 로컬 저장 기간을 가지며 초기화가없는 부울에 대해 0 초기화를 얻을.
static bool b; // b is zero-initialized
thread_local bool b2; // b2 is zero-initialized
당신은 부울는 사용자가 제공하는 생성자가없는 클래스의 멤버와 경우 제로 초기화가 얻는 또 다른 경우 암시 적 기본 생성자가 사소한이며, 클래스 인스턴스가 제로 또는 부가가치 초기화 됨.
참고 :이 코드는 templateatization이이 질문의 경우 bool 인 템플릿에 있지만 기본 생성자를 원하는 POD가 아닌 POD 일 수도 있습니다. – WilliamKF