빈 괄호가있는 기본 생성자
-
05-07-2019 - |
문제
빈 둥근 괄호 (괄호) 세트가 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