부동 상수에 대한 의사 소멸자를 호출하는 유효한 구문


9

다음과 같은 실증 프로그램을 고려하십시오.

#include <iostream>

int main()
{
    typedef float T;

    0.f.T::~T();
}

이 프로그램은에 의해 컴파일됩니다 Microsoft Visual Studio Community 2019.

그러나 clanggcc같은 오류를 발행

prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
    7 |     0.f.T::~T();
      |     ^~~~~

( 0.f ).T::~T()다음 과 같이 표현식을 작성하면 세 컴파일러 모두 프로그램을 컴파일합니다.

질문이 생겼습니다.이 기록이 0.f.T::~T()구문 적으로 유효합니까? 그렇지 않다면 어떤 구문 규칙이 깨졌습니까?


1
사이에 공간을 두는 0.f하고 .T모두 GCC와 연타가 발생하는 것은 ...이 동의합니다
크리스

1
뿐만 아니라(0.f).T::~T();
cigien

간단한 float f = 1.0f.t;것은 숫자 리터럴에 대한 오류를 생성합니다.
1201ProgramAlarm

A float내장형 이며 호출 할 소멸자가 없습니다. 소멸자를 수동으로 호출하는 것조차 무엇입니까? 새로운 지역 이외의 지역에서는 큰 문제가 되지 않습니다.
Jesper Juhl

@ JesparJuhl 소멸자가 아니라 의사 소멸자, 나는 그것이 존재한다는 것을 알게되었습니다. 태그 정보에 예제가 있습니다 (소멸자 btw에 대한 정당한 호출이 없음)
idclev 463035818

답변:


3

숫자 형 토큰의 구문 분석은 매우 조잡하며 실제로 유효하지 않은 많은 것들을 허용합니다. C ++ 98에서 [lex.ppnumber]에있는 "전처리 번호"의 문법은 다음과 같습니다.

pp-number:
    digit
    . digit
    pp-number digit
    pp-number nondigit
    pp-number e sign
    pp-number E sign
    pp-number .

여기서, "비 숫자"는 숫자 이외의 식별자에 사용될 수있는 문자이며 "기호"는 + 또는-입니다. 이후 표준은 작은 따옴표 (C ++ 14) 및 p-, p +, P-, P + (C ++ 17) 형식의 시퀀스를 허용하도록 정의를 확장합니다.

결론은 모든 버전의 표준에서 사전 처리 번호는 숫자 또는 마침표 뒤에 숫자로 시작해야하며 그 후에 임의의 숫자, 문자 및 마침표가 뒤따를 수 있다는 것입니다. 최대 뭉크의 규칙을 사용하여, 그는 다음 0.f.T::~T();과 같이 토큰 화 될 필요가있다 0.f.T :: ~ T ( ) ;하더라도, 0.f.T유효한 수치 토큰이 아닙니다.

따라서 코드는 구문 상 유효 하지 않습니다.


흥미롭게도, 실제로 [lex.pptoken]과 비슷한 예가 있습니다 : eel.is/c++draft/lex.pptoken#5
chris

1

사용자 정의 리터럴 접미사 ud-suffixidentifier 입니다. 식별자는 숫자로 시작하지 않는 (일부 비 ASCII 문자 포함) 문자, 밑줄, 숫자의 순서입니다. 마침표 문자는 포함되지 않습니다.

따라서 비 식별자 시퀀스 f.T를 식별자로 취급하므로 컴파일러 버그 입니다.

0.A는 소수점 상수 중 다음, 선택 지수하여 다음 할 수 UD 접미사 또는 (사용자 정의에 대한 리터) 부동 소수점 접미사 (중 하나 fFlL). 또한 ud-suffxf간주 될 수 있지만 다른 리터럴 유형과 일치하므로 UDL이 아닌 해당 유형이어야합니다. UD-접미사 식별자로서 문법 정의된다.


왜 ud- 접미사로 해석됩니까?
모스크바에서 Vlad

@VladfromMoscow는 0.A는 소수점 상수 . 그 뒤에 (지수 항목 제외) ud- 접미사 (사용자 정의 리터럴의 경우) 또는 부동 소수점 접미사 (중 하나 fFlL)가 올 수 있습니다. 또한 ud-suffxf간주 될 수 있지만 다른 리터럴 유형과 일치하므로 UDL이 아닌 해당 유형이어야합니다. UD-접미사 가 AS 문법 정의 식별자 .
1201ProgramAlarm

@ 1201ProgramAlarm : fud-suffix로 해석 될 수있는 반면, 식별자에 속할 수 f.T없어야합니다 .. 그러나 그것은 ... 컴파일러 버그라고 말하지만 더 복잡하다는 것을 확신합니다.
Jarod42
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.