development

빈 괄호가있는 기본 생성자

big-blog 2020. 5. 13. 20:45
반응형

빈 괄호가있는 기본 생성자


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

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

MyObject  object();  // error

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


가장 까다로운 파싱

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

같은 문제의 또 다른 예 :

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 및 목록 초기화 (균일 한 초기화라고도 함)를 사용할 수있는 경우 :

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 object1 = MyObject();
MyObject object2 = MyObject(object1);

C ++ 0x에서는 다음도 가능합니다 auto.

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

컴파일러는이 문장을 알지 못할 것입니다.

MyObject 객체 ();

반환 형식이 MyObject 이고 매개 변수가없는 object 라는 함수를 선언하는 생성자 호출 또는 함수 프로토 타입 입니다.


여러 번 언급했듯이 선언입니다. 이전 버전과의 호환성을위한 방법입니다. 레거시로 인해 구피 / 일관되지 않음 / 고통 / 거짓 인 C ++의 많은 영역 중 하나입니다.


n4296 [dcl.init]에서 :

[주 :
이후 ()의 구문에서 허용되지 초기화 , X a();선언 아닌 객체 클래스 X의 있지만 선언 함수 인수를 복용하지 및 X. 께 형태 ()를 돌려는 (다른 특정 초기화 문맥에서 허용 5.3.4, 5.2.3, 12.6.2).
— 끝 노트]

C ++ 11 링크
C ++ 14 링크


다른 사람들이 말했듯이 함수 선언입니다. C ++ 11부터 기본 생성자가 사용되었음을 명시 적으로 알려주 는 빈 것을 보아야 할 경우 중괄호 초기화를 사용할 수 있습니다 .

Jedi luke{}; //default constructor

참고 URL : https://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets

반응형