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

标签 c++ syntax floating-point c++17 pseudo-destructor

考虑以下演示程序。

#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()在语法上是否有效?如果没有,那么什么语法规则就被打破了?

最佳答案

数字标记的解析非常粗糙,并且允许许多实际上不是有效数字的事物。在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)。

结果是,在该标准的任何版本中,都要求预处理数字以数字或以句点开头的数字开头,之后可以是数字,字母和句点的任意序列。使用最大munch规则,即使0.f.T::~T();不是有效的数字 token ,也需要将0.f.T :: ~ T ( ) ;标记为0.f.T

因此,该代码在语法上不是,而是

关于c++ - 为浮点常量调用伪析构函数的有效语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61278180/

相关文章:

types - 将 Z3 Real 类型转换成浮点

c - C中分数简化程序的浮点异常

Python格式化 float 时默认四舍五入

c++ - 指令级并行探索

c++ - 模板类型略有变化后继承特征类

c++ - 在 C++ 中使用 libsvm

asp.net - 有没有办法通过电子邮件发送 ASP.NET 中的所有输入控件值

c - : 和有什么区别

c++ - 模板和访问者模式

php - 这是有效的 PHP 吗?复杂的 If 语句