2014-09-01 4 views
19
#include <cstdio> 

class A 
{ 
public: 
    A(int){puts("3");}; 

    int foo(){puts("4");return 10;} 
}; 

int main() 
{ 
    A a(a.foo()); 
    return 0; 
} 

출력 4와 3멤버 함수를 생성자의 정의되지 않은 동작에 대한 인수로 사용하고 있습니까?

이 생성자를 호출하기 전에 멤버 함수를 호출합니다. 행동은 표준에 의해 정의됩니까?

+8

예, 이것은 정의되지 않은 동작입니다. 아직 초기화되지 않은 변수에 대해 멤버 함수를 호출하고 있습니다. – Mankarse

+1

'A * bar = NULL;''bar-> foo();'도 작동합니다 .. 아시다시피. 그래도 정의되지 않았습니다. 나는 또한 다음과 같은 것을 시도했다 :'char buffer [256]; A * bar = (A *) & 버퍼 [0]; bar-> foo();'역시 작동합니다 .. 아직 정의되지 않았습니다. – Brandon

+1

왜 이것이 허용되는 것입니까? 선언이 끝나기 전에 어떻게'a'에 접근 할 수 있습니까? – Irfy

답변

31

§12.7 [class.cdtor]/P1 : 적지 않은 생성자 개체의

생성자 전에 개체 중 비 정적 부재 또는베이스 클래스 참조하여 실행을 시작할 정의되지 않은 동작이 발생합니다.

준수 컴파일러는 다리를 날려 보내는 코드를 방출 할 수 있습니다.

+0

중요한 사람이 아닌 사람은 무엇입니까? – Davor

+6

@Davor 본질적으로, 어떤 것을하는 모든 생성자. –

+1

비어있는 생성자도 @ T.C가 아닌가? ? –

4

예. 실제로는 A::fooa 인스턴스의 상태가 아니기 때문에 작동 할 수 있습니다. 이런 식으로 코드를 작성하면 안된다.