2013-07-04 3 views
3
는 스트로브 스트 룹의 는 C++ 프로그래밍 언어 (4 판 여기)에서 §6.3.5.1의 마지막 문장은

: 배열 또는 구조 인 경우Stroustrup의 C++ 프로그래밍 언어에 오류가 있습니까?

배열의 구성원 또는 클래스가 기본 초기화됩니다.

그러나, this test는 기본 초기화 객체의 초기화되지 않은 회원

#include <iostream> 

struct Foo 
{ 
    int i; 

    Foo(); 
}; 

Foo::Foo() {} 

int main() 
{ 
    Foo f; 
    std::cout << "f.i: " << f.i << std::endl; 

    return 0; 
} 

내가 모르는 뭔가가 있어야합니다 (I도 g++4.7 -std=c++11으로 시도)를 보여줍니다, 그러나 의미하지 않는다 설명이있다 Stroustrup의 확인에 오류가 있습니까?


편집 : 답변 후 나는 기본 개념은이 (예를 들어, §17.3.1에서) 텍스트의 다른 부분에서 초기화되지 않은을 소위 포함하도록되어 초기화 이해합니다. 이것은 나에게 매우 불투명하게 들린다. 실제로 초기화되지 않은을 사용하면 "명시 적으로 사용자 초기화되지 않음"(다른 경우)과 같은 의미는 모순입니다. 일부 항목은 기본적으로 초기화되지만 아직 초기화되지 않았습니다. 하나는 X와 UN-X는 반대 일의 독점 세트를 분류하는 자연 언어 증거 ... 또한

, 같은 섹션에서 이전 문장을 삭제하지 않는 한 (§6.3.5.1)

로컬 읽고 변수 [...]는 기본 생성자가있는 사용자 정의 유형이 아닌 한 기본적으로 초기화되지 않습니다. [...]

여기에도 모순이 다시 나타납니다. 첫 번째 문과 후자의 문을 모두 받아들이면 은 변수가 (즉, 지역 변수) 동시에 이 기본값 인이 기본값으로 초기화되지 않았 음을 의미합니다..

IMHO 이것은 무엇보다도 자연 언어를 사용하여 설명하는 것이 가장 바람직하지 않습니다.

+1

나는 "기본 초기화"가 "정의되지 않은 값으로 초기화"될 수 있다고 생각합니다.그것은 초기화되고 쓰기가 안전하지만 읽을 수는 없습니다. 그러나 예, 말씨는 혼란스럽고 스스로 모순됩니다. –

답변

6

8.5/7 § :

가 타입 T의 목적 디폴트 초기화 수단 :
- T가 (아마도 CV-QUALI 인터넷 ED) 클래스 타입 (항 9), 기본 생성자이면 T가 호출되면 (그리고 T가 접근 가능한 디폴트 생성자를 가지지 않는다면 초기화는 부적절하다);
- T가 배열 유형이면 각 요소가 기본값으로 초기화됩니다.
- 그렇지 않으면 초기화가 수행되지 않습니다.

은 초기화되지 않은 채로 남습니다. 구성원의 유형이 예 : std::string 인 경우 기본 생성자를 std::string이라고하고 빈 문자열을 사용하게됩니다.

+0

나는 그것이 최고로 불분명하다고 생각한다. 이전 텍스트에서 값이 0 인 디폴트 초기화 된 int를 이해할 것입니다 (예를 들어 글로벌 int 변수의 경우). 사실, 이전 페이지에서는 "로컬 변수 [...]가 기본 생성자가있는 사용자 정의 유형이 아닌 경우 기본적으로 초기화되지 않습니다"라고 읽습니다. 그래서, 이것은 (당신이 게시 한 정의에 의해) 디폴트 초기화 된 변수가 될 것이지만, 기본적으로 초기화되지 않았을 것입니다 ... 제게는 매우 일관된 소리가 나지 않습니다 – ricab

+3

@ricab, 표준은 디폴트 초기화, 값을 정의합니다 - 초기화, 제로 - 초기화. 초기화되지 않은 것은 이러한 범주 중 하나가 아닙니다. 전역 변수 주석에 대해서는 'int'(그리고 기본적으로 모든 것)에 대해 0을 의미하는 0으로 초기화되는 (§ 3.6.2/2). int를 초기화하면 0이됩니다. 그것을 초기화하지 않으면, 초기화되지 않은 채로 남을 것이다. 이것은 초기화자를 사용하지 않고 일반 로컬'int'를 선언 할 때 기본적으로하는 일입니다. 'int'는 사용자 정의 타입이 아니기 때문에 기본적으로 초기화되지 않습니다. – chris

+1

@ricab, default-initialization으로 인해 초기화되지 않은 것들이 초기화되지 않는다는 사실은 이상하게 들릴지 모르지만 모든 것을 쉽게 분류 할 수 있습니다. – chris