2017-09-14 14 views
4

이 매우 간단한 코드를 고려해C++ 함수 정의와 변수 선언 불일치?

#include <memory> 

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

class Bar 
{ 
public: 
    Bar(const std::shared_ptr<Foo>& foo) {} 
}; 

int main() 
{ 
    Foo* foo = new Foo; 
    Bar bar(std::shared_ptr<Foo>(foo)); 
    return 0; 
} 

비주얼 스튜디오는

warning C4930: 'Bar bar(std::shared_ptr<Foo>)': prototyped function not called (was a variable definition intended?) 

를보고하고 ... 방법이 라인은 함수 정의로 해석 될 Bar bar(std::shared_ptr<Foo>(foo)); 수 있습니다 생성되지 않음 bar 오브젝트가 존재하지 않는 이유는 무엇입니까?

나는 Do the parentheses after the type name make a difference with new?C++: warning: C4930: prototyped function not called (was a variable definition intended?)을 확인,하지만 난 내 문제는 내가 구문 Foo()Bar()을 사용하지 않은 여기에 다른 느낌.

편집 : 성공적으로 컴파일합니다 :

Foo* foo = new Foo; 
std::shared_ptr<Foo> fooPtr(foo); 
Bar bar(fooPtr); 
+9

C++에서 가장 까다로운 구문 분석. –

+0

@ 眠 り ネロ ク 아니, gcc가 –

+1

@RichardHodges를 컴파일하므로 MSVC도 경고입니다.眠り ネロ ク가 맞습니다. – Quentin

답변

14

이 문제에 대한 C++'s most vexing parse입니다. 문 :

Bar bar(std::shared_ptr<Foo>(foo)); 

Bar를 반환하고 유형 std::shared_ptr<Foo>foo라는 인자를 bar를라는 함수를 선언합니다.

가장 안쪽 괄호는 아무 효과가 없습니다. 다음 작성한 것 것과 같다 :

Bar bar(std::shared_ptr<Foo> foo); 

당신이 중괄호 구문을 사용할 수 있습니다 (이미 std::shared_ptr을 사용하고 있기 때문에) C++ (11) 가정 대신 괄호 의 :

Bar bar(std::shared_ptr<Foo>{foo}); 

Bar의 오브젝트 bar을 실제로 작성합니다. 위의 명령문은 선언으로 해석 될 수 없으므로 중괄호.

+3

'Bar bar (std :: shared_ptr foo);와 같은 의미입니까? – jpo38

+2

정답이지만 가장 잘하는 구문 분석에 대한 설명이나 링크가 있고 해결책을 제시하면 더 나은 대답이 될 수 있습니다. – aschepler

+0

가능한 C++ 98 또는 TR1 솔루션은 의도 된 변수 이름 뒤에 이중 괄호를 사용하는 것입니다. 매개 변수 이름은 비록 매개 변수 선언이 하나만 포함되어 있어도 전체 매개 변수 목록이 아닌, 쓸데없는 괄호로 묶을 수 있습니다. 그래서, 예 :'''bar bar ((std :: tr1 :: shared_ptr (foo)))''. 아니 아주 읽을 수 있지만 ... –