2014-10-28 2 views
-1
#include <fstream> 
#include <iostream> 

class Bar { }; 

class Foo { 
    public: 
    Foo(Bar&) { } 
}; 

int main() 
{ 
    Foo bar(Bar()); 
} 

Bar()는 무엇을 반환하며 왜이 코드가 컴파일됩니까?생성자의 반환 값을 인수로 전달

+0

"왜 이것을 컴파일합니까?" 'main'을'Foo bar ((Bar()));로 변경하면 원하는 동작을 가진 코드가 컴파일되지 않습니다 :-) – dasblinkenlight

답변

1

실제로 아무 것도하지 않기 때문에 실제로는 Bar()이 무엇을 반환해도 상관 없습니다! 문

Foo bar(Bar()); 

Foo를 반환하고 인수를 복용하지 않는 기능을 소요하고 인수로 Bar를 반환하는 기능 bar를 선언 함수 선언이다. 이런 선언은 Most Vexing Parse으로 알려져 있습니다. 문을 가정

는 표현 Bar()Bar의 기본 생성자를 호출하여 유형 Bar의 임시 객체를 생성 할

Foo bar{Bar()}; 

로 작성되었습니다. 물론 Bar()에 의해 생성 된 임시를 Foo의 생성자가 기대하는 비 const 왼쪽 값 참조에 바인딩 할 수 없기 때문에 코드가 컴파일되지 않습니다.

+0

Foo bar {Bar)}; 비주얼 스튜디오 2014에서 잘 컴파일되었습니다. Visual Studio에 결함이 있습니까? –