2011-05-08 4 views
24

코드를 here에서 얻었습니다.가장 고생스러운 구문 분석

TimeKeeper time_keeper(Timer()); 

을하지만 return time_keeper.get_time();가있는 경우에만 발생합니다

그것의 모습에서
class Timer { 
public: 
    Timer(); 
}; 

class TimeKeeper { 
public: 
    TimeKeeper(const Timer& t); 

    int get_time() 
    { 
     return 1; 
    } 
}; 

int main() { 
    TimeKeeper time_keeper(Timer()); 
    return time_keeper.get_time(); 
} 

, 그것으로 인해 라인에 오류를 컴파일 받아야합니다.

이 줄이 중요한 이유는 무엇입니까? 컴파일러는 time_keeper(Timer()) 구조에서 모호한 부분을 나타냅니다.

+0

의 중복 가능성 (http://stackoverflow.com/questions/3810570/why-is- :

이것은 컴파일러가 코드를 보려면 어떻게 거기에 no-call-to-the-constructor) – Mark

답변

24

이것은 TimeKeeper time_keeper(Timer());이 변수 정의가 아닌 함수 선언으로 해석되기 때문입니다. 이것은 자체적으로 오류가 아니지만 time_keeper (TimeKeeper 인스턴스가 아닌 함수)의 get_time() 멤버에 액세스하려고하면 컴파일러가 실패합니다. [왜 생성자에는 전화가 없다]

int main() { 
    // time_keeper gets interpreted as a function declaration with a function argument. 
    // This is definitely *not* what we expect, but from the compiler POV it's okay. 
    TimeKeeper time_keeper(Timer (*unnamed_fn_arg)()); 

    // Compiler complains: time_keeper is function, how on earth do you expect me to call 
    // one of its members? It doesn't have member functions! 
    return time_keeper.get_time(); 
} 
+0

표준이 §13.1/3에서 Timer 함수 유형이이 상황에서 함수 유형에 대한 포인터가되도록 조정된다는 것을 알고 있지만 왜 다른 사람이 원하는지 조정 시작? §13.1/3이 '가장 애타게 파싱하는'문제를 만들어 냈습니다. –