C++의 가장 짜증나는 구문 분석

머리말

저는 이런 상황을 겪은 적이 있는데 당시에는 이유를 몰라서 다른 사람들에게 물어봤지만 알아내지 못했습니다. 나중에 우연히 기사를 보다가 문득 깨닫고 빠르게 녹음을 하게 되었습니다.

가장 짜증나는 구문 분석

Most Vexing Parse는 가장 성가신 구문 분석으로 변환됩니다.이 문제는 무엇보다도 C++11에서 std::thread를 사용하여 객체를 생성할 때 발생합니다.

그러한 클래스를 작성했고 복사 생성자를 호출한다고 가정해 보겠습니다.

class String {
    
    
public:
    String() {
    
    
        cout << "String()" << endl;
    }

    String(const std::string &name) {
    
    
        cout << name << endl;
    }
};

통화 구현:

int main() {
    
    
    char *t = "helloworld";
    String s(std::string(t));        // no result
    return 0;
}

이상적으로는 복사 생성자를 호출할 것이라고 생각하지만 실제로는 이 줄이 컴파일러에 의해 함수 선언으로 간주되기 때문에 아무것도 출력되지 않습니다!

위에 전달된 것은 익명 객체입니다. 이 객체는 하나의 매개변수(함수 포인터가 매개변수 t를 가리키고 문자열 객체를 반환함)를 취하고 String 객체의 함수 선언을 반환하는 s라는 함수로 구문 분석됩니다.

이와 같은 문제를 "가장 짜증나는 구문 분석"이라고 합니다.

해결책

Scott Meyers는 Effective C++에서 다음 솔루션을 언급했습니다.

String s((std::string(t)));        // ok

외부에 다시 ​​브래킷을 추가하세요!

또한 C++11에서는 균일 초기화를 사용하여 이러한 모호성을 처리할 수도 있습니다.

String ss{
    
    std::string(t)};        // ok

요약하다

이것은 고전적인 모호성 문제입니다. 이런 종류의 문제에 대해서는 이런 종류의 코드 작성을 피해야 합니다. 작성했다면 모호성을 피하기 위해 기사의 두 가지 솔루션을 사용하여 해결할 수 있습니다.

C++의 가장 짜증나는 구문 분석

추천

출처blog.csdn.net/no_say_you_know/article/details/126333958