2012-12-18 2 views
6

이전에 C++에서 실행 한 적이 없지만 여전히 컴파일되지만 예상 한대로 작동하지 않는 것은 이상합니다. 누군가 그것이하는 일을 내게 말할 수 있습니까? 자세한 내용은 코드를 참조하십시오.C++에서 클래스 인스턴스화 : 이상한 구문 버그

#include <iostream> 
using namespace std; 

class Test{ 
    public: 
     Test(); 
}; 

Test::Test(){ cout << "ctor" << endl; } 

int main(void){ 

    Test t(); // this compiles but doesn't call the constructor 

    return(0); 
} 

그것은 컴파일,하지만 난 "t"를 사용하려고하면 그것을하지 않습니다 것입니다. 필자는 생성자 기능에만 의존하고 있었고 코드가 예상대로 작동하지 않았습니다. 해결 방법은 괄호 "Test t();"를 잃는 것입니다. "Test t;"로 이동하십시오. 내 질문은 "Test t();"에서 진행되고있는 작업입니다. 예를 들어, 컴파일러가 컴파일을 할 수 있다고 생각하는 것은 무엇입니까?

+5

가장 골치 아픈 구문 분석을 찾기 :

가장 쉬운 방법은 괄호 제거하고 단순히로 변수를 선언 얻을 수 있습니다 구문 분석 수정 합니다. – chris

+1

귀하의 Rite of Passage에 오신 것을 환영합니다. –

+0

질문은 컴파일러가 당신이 무엇을 기대하고 있었는지 알고 있었습니까? :) – Carl

답변

5

이것은 Most Vexing Parse입니다. 기본적으로 C++ 구문 분석 규칙에 따르면 t 형식의 형식의 개체가 아니라 t 함수의 함수 선언은 0 인수를 받아 Test을 반환합니다.

덧붙여 말하자면, clang ++는 실제로이 상황을 인식하고 경고 메시지를 내며 이는 사용자가 원하는 것을 수행하지 못하고 있음을 나타냅니다.

+0

다른 함수에서 함수를 선언/정의 할 수 있습니까? 내가 안 그랬니? –

+0

@ KarthikT : C++에서 중첩 된 함수를 정의 할 수는 없지만 확실히 선언 할 수는 있습니다. 예를 들어, 이것은 잘 작동합니다 :'int main() {void foo(); foo(); } void foo() {std :: cout << "foo"<< std :: endl; }' –

+0

@Karthik : 다른 함수 안에서 함수를 * 선언 할 수 있습니다. C 이후 – AnT

1

이것은 일반적으로 이라는 가장 일반적인 구문 분석 인으로 일반적인 문제입니다. 귀하의 라인 Test t();은 두 가지 방법 중 하나로 해석 될 수 있습니다.

  1. 그것은 형인 변수 t를 선언 할 수 Test
  2. 그것은 Test 값을 반환하고 인수

은 C++ 표준 불행히도 컴파일러를 필요 취하지 않는다 함수 t()를 선언 할 두 번째 대안을 고려해보십시오. 이것은 상당히 짜증나는 파싱입니다.

Test t; // Will call the default constructor