이전 질문에 대한 흥미로운 후속 조치 (실제적으로 크게 중요하지는 않음) : 왜 C ++에서 변수를 선언 할 때 변수 이름을 괄호로 묶을 수 있습니까?
괄호 안의 선언과 삽입 된 클래스 이름 기능 을 결합하면 컴파일러 동작과 관련하여 놀라운 결과를 얻을 수 있다는 것을 알았습니다 .
다음 프로그램을 살펴보십시오.
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
g ++ 4.9.2로 컴파일하면 다음과 같은 컴파일 오류가 발생합니다.
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
MSVC2013 / 2015로 성공적으로 컴파일되고 인쇄됩니다.
C (B *)
clang 3.5로 성공적으로 컴파일되고 인쇄됩니다.
C
그래서 어떤 질문이 옳은가? :)
(기술적으로 typedef로 유형을 변경 한 후 변수 선언을 중지하는 msvc 방법은 clang 버전으로 강력하게 흔들 렸습니다.)
C::C
유형의 이름을 지정하지 않고 함수 이름을 지정하므로 GCC가 맞습니다.
C::C y;
말이 안되죠?C::C (y);
처음에는 이것이 Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse 의 인스턴스라고 생각 하지 않았습니다 .하지만 이제는 세 컴파일러가 모두 "올바른"것을 의미하는 정의되지 않은 동작이라고 생각합니다.