이것이 왜 컴파일되는지 이해하지 못합니다


80

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

struct A
{
};
struct B
{
};

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

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



8
@alterigel 정말입니까? 이 경우 모호성이 없습니다. 함수 선언 만 가능합니다. A a(B());변수 정의 또는 함수 선언이 될 수있는 것은 아닙니다 .
호두

8
아무 이름도 지정하지 않더라도 struct A{}; int main() { A(foo); } 그대로 컴파일 한다는 것을 알고 놀랄 foo것입니다.
Ayxan

20
@alterigel-이것은 가장 독창적 인 파싱 이 아닙니다 . 링크 한 페이지의 예제를보십시오. 이것은 단순히 함수 선언입니다.
Pete Becker

3
@PeteBecker, 호두가 이미 위와 같다고 생각 하지 않고 이것이 MVP가 아닌지 설명하는 것이 좋습니다 .
JPhi1618

답변:


84

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


5
이것이 바로 Most and Vexing입니다. 해결책 : (이 나쁜 구조를 노출하기 때문에 실제로는 아무것도 해결하지 않는 것이)A a{B};
user4581301

23
@ user4581301- 가장 까다로운 구문 분석이 아닙니다 . 단순히 함수 선언입니다.
Pete Becker

23
이 밝혀 그래서 그것은 단지의 대부분 ... 애 태우게 구문 분석
MooseBoys

11
그것에 대해 이상한 부분은 C ++의 중첩 된 기능을 허용하지 않습니다,하지만 것입니다 않은 함수 내부에 선언 할 수 있습니다.
The_Sympathizer

6
중첩 함수에 대한 지원을 C ++에 추가하기위한 좋은 동기 부여처럼 들립니다. 뿐만 아니라 그들은 도움이 될 것입니다, 그들은 : 합리적인 설계에이 이상한 사마귀를 돌려 줄
제레미 Friesner

15

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

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


13

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

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

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

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


12
나는 이것이 " 가장 vexing parse " 라고 불리지 않는다고 생각한다 . C에도 존재하는 일반적인 함수 선언 일뿐입니다. 행은 함수 선언 만 될 수 있으므로 모호한 해결은 필요하지 않습니다. 당신의 링크를보십시오. 예제는 모두 이와 다릅니다.
호두

3
사실이지만 가장 까다로운 구문 분석과 관련이 있습니다. 여기에는 원래 의도와 마찬가지로 변수 또는 생성자 호출 대신 형식 이름이 단독으로 사용되는 오타도 포함되어 있습니다.
Miral

1
예, 실제 사례가 "약간 Vexing 구문 분석"인 경우에도 "가장 Vexing 구문 분석"이 유용한 답변입니다.
jpa December

1
@ wlanut : 빈 struct A { };컴파일러는 일부 컴파일러에서 허용하더라도 표준 C에서는 유효하지 않습니다. 괄호를 버리고 문제가 없을 것입니다. 또한 C에서 선언하거나 정의 struct A해도 유형 이름이 작성되지 않습니다 A(접두어 없이 접두어를 사용 struct하거나 typedef struct A A;앞에 추가 해야합니다 ). 또한 C에서는 함수 선언에 대한 대안 구문 분석이 없습니다. 단순히 변수 정의를 사용할 수 없습니다. 항상 함수 선언입니다 (또는 유효하지 않습니다). 문제의 코드는 C에서는 유효하지 않습니다.Astructtype name(...);
Jonathan Leffler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.