为浮点常量调用伪析构函数的有效语法

问题描述 投票:8回答:1

请考虑以下演示程序。

#include <iostream>

int main()
{
    typedef float T;

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

此程序由Community Visual C++ 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()是否有效?如果没有,那么什么语法规则就被打破了?

c++ syntax floating-point c++17 pseudo-destructor
1个回答
0
投票

用户定义的文字后缀ud-suffixidentifieridentifier是字母(包括一些非ASCII字符),下划线和不以数字开头的数字的序列。不包括句点字符。

因此它是一个编译器错误,因为它将非标识符序列f.T视为标识符。

0.是一个分数常数,后面可以跟一个可选的指数,然后是ud-suffix(对于用户定义的文字)或floating-point-后缀fFlL之一)。也可以将f视为ud-suffx,但是由于它与另一个文字类型匹配,因此应该是那个而不是UDL。 ud-suffix在语法中定义为标识符。

© www.soinside.com 2019 - 2024. All rights reserved.