"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 가장 짜증나는 구문 분석: Timer() - 객체 호출인가, 함수 호출인가?

가장 짜증나는 구문 분석: Timer() - 객체 호출인가, 함수 호출인가?

2024년 12월 21일에 게시됨
검색:418

The Most Vexing Parse: Timer() - Object or Function Call?

가장 짜증나는 구문 분석: C 11의 모호성 풀기

C 11의 "가장 짜증나는 구문 분석" 모호성은 균일한 초기화 프로그램을 사용할 때 나타납니다. 다음 코드 조각에서 알 수 있듯이:

#include 

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

첫 번째 표현식 이해(auto dv = Timer())

첫 번째 표현식에서 auto 키워드는 dv 유형이 이니셜라이저에서 추론됨을 의미합니다. 등호(=) 오른쪽에 있습니다. 이니셜라이저는 인수 없이 Timer 객체를 반환하는 Timer 생성자를 호출하는 것입니다. 따라서 dv는 Timer 유형의 객체입니다.

두 번째 표현식 이해하기 (int time_keeper(Timer()))

두 번째 표현식에서는 다음과 같은 이유로 모호성이 발생합니다. 컴파일러는 Timer()가 함수 호출인지 또는 참조로 전달된 Timer 유형의 객체인지 확인할 수 없습니다.

  • If Timer() 함수 호출이면 int time_keeper(Timer())는 Timer 객체를 입력으로 사용하고 int를 반환하는 time_keeper라는 함수를 선언합니다.
  • Timer()가 Timer 유형의 객체이면 int time_keeper (Timer())는 Timer 객체에 대한 포인터를 입력으로 사용하고 int를 반환하는 time_keeper라는 함수를 선언합니다.

그러나 왜냐하면 함수는 인수로 전달될 때 포인터로 붕괴됩니다. time_keeper의 실제 유형은 int(Timer(*)())이며, 이는 포인터-함수 해석을 위해 모호성을 해결합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3