나는 분명히 뭔가를 놓치고 있지만 왜 이것이 컴파일되는지 이해하지 못한다 (g ++ 및 clang ++로).
struct A
{
};
struct B
{
};
int main()
{
A a(B);
}
우선 B
, 값이 아닌 유형입니다. 이 코드를 어떻게 해석해야합니까?
답변
라는 이름의 함수 선언으로 해석됩니다.이 함수 a
는 유형의 인수 하나를 취하고 B
를 반환합니다 A
.
답변
단순히 이름이없는 유형의 매개 변수 하나를 a
반환 A
하고 가져 오는 함수 라고 선언하는 함수 선언 일뿐 B
입니다.
함수 정의 내에서 함수 선언이 함수 정의 내에서 허용되므로 유효합니다.
답변
이 문제는 가장 까다로운 구문 분석 으로 알려져 있습니다. 이 행 A a(B);
은 a
type의 객체를 반환 A
하고 이름이없는 type의 매개 변수를 사용 하는 함수의 선언으로 해석 될 수 있습니다 B
.
이 문제를 피하는 한 가지 방법 은 괄호 대신 중괄호를 사용하는 C ++ 11에 도입 된 균일 한 초기화 구문 을 사용하는 것입니다 A a{B};
. 오류를 반환합니다. 행은 이제 B
값 대신 유형 인으로 초기화 된 변수 선언으로 해석됩니다 .
자세한 내용은 다음과 같습니다.