문제

빈 둥근 괄호 (괄호) 세트가 C ++에서 기본 생성자를 호출하는 데 유효하지 않은 이유가 있습니까?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error

나는 매번 "()"을 자동으로 입력하는 것 같습니다. 이것이 허용되지 않는 좋은 이유가 있습니까?

도움이 되었습니까?

해결책

대부분의 vexing parse

이것은 "C ++의 가장 vexing 구문 분석"이라고 알려진 것과 관련이 있습니다. 기본적으로 컴파일러가 함수 선언으로 해석 할 수있는 것은 함수 선언으로 해석됩니다.

동일한 문제의 또 다른 사례 :

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v 2 개의 매개 변수가있는 함수 선언으로 해석됩니다.

해결 방법은 다른 괄호 쌍을 추가하는 것입니다.

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

또는 C ++ 11 및 List Initialization (균일 초기화라고도 함)이있는 경우 :

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

이를 통해 함수 선언으로 해석 할 수있는 방법이 없습니다.

다른 팁

기능에 대한 선언으로 취급되기 때문입니다.

int MyFunction(); // clearly a function
MyObject object(); // also a function declaration

동일한 구문이 함수 선언에 사용됩니다 - 예 : 기능 object, 매개 변수를 복용하지 않고 반환 MyObject

컴파일러는 그것이 인수를 취하지 않고 myObject 인스턴스를 반환하는 함수의 선언이라고 생각하기 때문에.

컴파일러는이 진술이 있는지 알지 못할 것 같습니다.

myObject Object ();

생성자 호출 또는 이름이 지정된 함수를 선언하는 기능 프로토 타입입니다. 물체 반환 유형으로 myObject 그리고 매개 변수가 없습니다.

당신은 또한 더 장황한 건축 방법을 사용할 수도 있습니다.

MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);

C ++ 0x에서도 이것은 또한 허용됩니다 auto:

auto object1 = MyObject();
auto object2 = MyObject(object1);

여러 번 언급했듯이, 그것은 선언입니다. 뒤로 호환성이 있습니다. 유산으로 인해 구피/일관성이없는/고통스러운/가짜 인 C ++의 많은 영역 중 하나입니다.

N4296에서 [dcl.init] :

메모:
부터 () 구문에 의해 허용되지 않습니다 이니셜 라이저, X a(); An의 선언이 아닙니다 물체 클래스 X의 그러나 a의 선언 기능 논증을 취하지 않고 X를 반환하지 않습니다. 양식 ()은 다른 초기화 컨텍스트 (5.3.4, 5.2.3, 12.6.2)에서 허용됩니다.
- 엔드 참고

다른 사람들이 말했듯이, 그것은 기능 선언입니다. C ++ 11이므로 빈을 볼 필요가있는 경우 Brace 초기화를 사용할 수 있습니다. 무엇 이는 기본 생성자가 사용되었음을 명시 적으로 알려줍니다.

Jedi luke{}; //default constructor
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top