이것이 왜 컴파일되는지 이해하지 못합니다 분명히 뭔가를

나는 분명히 뭔가를 놓치고 있지만 왜 이것이 컴파일되는지 이해하지 못한다 (g ++ 및 clang ++로).

struct A
{
};
struct B
{
};

int main()
{
  A a(B);
}

우선 B, 값이 아닌 유형입니다. 이 코드를 어떻게 해석해야합니까?



답변

라는 이름의 함수 선언으로 해석됩니다.이 함수 a는 유형의 인수 하나를 취하고 B를 반환합니다 A.


답변

단순히 이름이없는 유형의 매개 변수 하나를 a반환 A하고 가져 오는 함수 라고 선언하는 함수 선언 일뿐 B입니다.

함수 정의 내에서 함수 선언이 함수 정의 내에서 허용되므로 유효합니다.


답변

이 문제는 가장 까다로운 구문 분석 으로 알려져 있습니다. 이 행 A a(B);atype의 객체를 반환 A하고 이름이없는 type의 매개 변수를 사용 하는 함수의 선언으로 해석 될 수 있습니다 B.

이 문제를 피하는 한 가지 방법 은 괄호 대신 중괄호를 사용하는 C ++ 11에 도입 된 균일 한 초기화 구문 을 사용하는 것입니다 A a{B};. 오류를 반환합니다. 행은 이제 B값 대신 유형 인으로 초기화 된 변수 선언으로 해석됩니다 .

자세한 내용은 다음과 같습니다.

가장 Vexing 구문 분석 :이를 발견하고 신속하게 수정하는 방법


답변