>백엔드 개발 >C++ >가장 짜증나는 구문 분석은 무엇이며 왜 C 11에서 발생합니까?

가장 짜증나는 구문 분석은 무엇이며 왜 C 11에서 발생합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 10:55:30854검색

What's the Most Vexing Parse and Why Does It Happen in C  11?

균일 초기화 프로그램과 가장 까다로운 구문 분석 이해

C 11에서 균일 초기화 프로그램은 객체와 데이터 구조를 초기화하기 위한 간결한 구문을 제공합니다. 그러나 이를 사용하면 "가장 짜증나는 구문 분석"이라고 알려진 잠재적인 모호성이 발생할 수 있습니다.

가장 짜증나는 구문 분석

다음 코드 조각을 고려하세요.

<code class="cpp">#include<iostream>

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

int main() 
{
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"?
    return 0;
}</code>

분석:

dv = Timer();

  • Timer()는 두 가지 함수 중 하나로 해석될 수 있습니다. 호출 또는 객체 구성.
  • dv 선언에 auto를 사용하므로 오른쪽 표현식에서 유형을 추론합니다.
  • Timer()가 함수 호출로 해석되는 경우 , Timer()는 객체를 반환하는 함수가 아니기 때문에 dv는 int가 됩니다.
  • 그러나 Timer()가 객체 생성으로 해석되면 dv는 Timer 객체가 됩니다.

int time_keeper(Timer());

  • Timer()는 임시 Timer 객체를 생성하는 것으로 해석됩니다.
  • time_keeper의 인수는 다음과 같습니다. 타이머를 반환하고 인수를 취하지 않는 함수에 대한 포인터.
  • 함수는 인수로 전달될 때 암시적으로 포인터로 변환됩니다.
  • 따라서 time_keeper 유형은 int(Timer (*)()).

결론:

"가장 짜증나는 구문 분석" 시나리오에서 컴파일러는 구문 분석의 유형과 해석을 추론하려고 시도합니다. 문맥과 규칙에 기초한 표현. 이러한 규칙이 어떻게 적용되는지 이해함으로써 프로그래머는 모호성을 피하고 명확한 의도를 가지고 코드를 작성할 수 있습니다.

위 내용은 가장 짜증나는 구문 분석은 무엇이며 왜 C 11에서 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.