2010-11-26 5 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

예상 출력 :생성자 호출 메커니즘

1) Default 
2) Copy 

실제 출력 : 생성자 호출 메커니즘에 대한 이해 잘못 무엇


?

Note 간결함을 위해 헤더 파일을 생략했습니다.

답변

11

사례 1)

m은 함수의 반환 my 및 인수를 복용하지로 해석됩니다. 이 더 나은 "대부분 애 태우게 파스"로 알려진 뭔가 예상 출력이 () 즉이 my m;

사례 2)

사용 제거 참조하십시오.

n은 인수를 취하지 않고 my을 반환하는 함수에 대한 포인터 형식의 인수를 취하는 my을 반환하는 함수로 해석됩니다.

이 경우 예상 출력이 my n((my()));

내 해석 [대신 전자의 경우에서와 같이 인수 사양으로 처리 컴파일러가 지금 때문에 추가 ()의 표현으로 해석 할의] 시도 보려면 :

my n((my()))my n = my()과 같습니다. 이제를 rvalue 표현 my()가 생성 [즉, 기본 생성자를 호출] 임시 및 n 복사하는 임시 개체로 초기화된다 때문의 복사 ctor에없이 호출 일부 compiler optimization]

PS : 나는 아니다 내 대답의 마지막 부분에 대해 100 % 확신합니다. 내가 틀렸다면 나를 바로 잡아라.

+1

RVO는 아니지만 실제로는 일반적인 최적화입니다. – MSalters

+3

@MSalters : 네, 이건 RVO의 변형이라고 생각합니다. :) –

1

Prasoon처럼 C++ 컴파일러가 예상치 못한 방식으로 코드를 파싱하는 것으로 의심됩니다. 예를 들어, 나는 그것이 아닌 변수 선언으로, 함수 프로토 타입 선언과 같은 줄

my m(); 

를 분석하고 생성자에 전화를 생각 - 더 출력을 볼 수 없습니다 따라서 이유.