빈 괄호가있는 기본 생성자
빈 괄호 (괄호) 세트가 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부터 기본 생성자가 사용되었음을 명시 적으로 알려주 는 빈 것을 보아야 할 경우 중괄호 초기화를 사용할 수 있습니다 .
Jedi luke{}; //default constructor
참고 URL : https://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets
'development' 카테고리의 다른 글
배치 파일에서 명령 출력을 변수로 설정하는 방법 (0) | 2020.05.13 |
---|---|
npm을 사용하여 모듈을 전체적으로 설치하려면 어떻게합니까? (0) | 2020.05.13 |
C ++에서 "super"사용 (0) | 2020.05.13 |
이벤트 핸들러가 jQuery의 요소에 바인딩되어 있는지 테스트 (0) | 2020.05.13 |
psql을 사용하여 데이터베이스에 설치된 확장을 어떻게 나열합니까? (0) | 2020.05.13 |