2012-10-09 4 views
8

가능한 중복은 :
std::string x(x);왜 생성중인 개체에서 전달되는 복사 생성자를 호출 할 수 있습니까? (C++) (GCC)

class A {}; 

int main() { 

    A a(a); 
} 

이 컴파일합니다.

GCC (GCC) 4.7.2 20120921 (4.7.2-2 레드햇)
g++ -o main main.cpp -Wall -w -ansi

나는 더 경고를받을 수 없습니다.

왜 이것이 유효한 C++로 보이는가?
표준 어디서나 언급 되었습니까?
gcc에서이를 신고 할 수있는 경고 플래그가 있습니까?

클래스에 구성원 데이터가 있으면 데이터가 임의로 끝납니다.
예 :

#include <iostream> 

class A { 

public: 
    int i; 
    A() : i{6} {} 
}; 

int main() { 

    A a(a); 
    std::cout << a.i << '\n'; 
} 

출력 : 여기 -482728464

을 무슨 일이야? 또한 실수로이 작업을 수행하지 못하게하려면 어떻게해야합니까? - 컴파일러 오류가 될 수 있습니까?

+2

더 간단한 예제 인 'int i = i;'에 유의하십시오. – GManNickG

+1

Clang 3.2는 최근 이러한 사례를 탐지하는 알고리즘을 검토 한 결과 [uninitialized.cpp] (http://llvm.org/svn/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp) 파일을 확인할 수 있습니다. 테스트 스위트에서 경고하는 모든 사례를 볼 수 있습니다. gcc의 경우 * 초기화되지 않은 * 경고는 잠재적으로 최적화 수준에 연결되며 'O1' 또는'O2' 빌드에 대해서만 트리거 될 수 있습니다. –

답변

10

이름에 대한 선언의 점 아래 언급 된 경우를 제외하고는 완벽한 선언자 (8 조)의 후 초기화 (있는 경우)의 직전에있다 (3.3.2/1 §). [예 :

여기서 두 번째 x는 자체 (불확정) 값으로 초기화됩니다. -end example]

이것은 사용자 정의 유형 (예 :)에도 적용됩니다. 사용 된 복사 생성자가 컴파일러에 의해 자동 생성 된 기본 생성자입니다.