代码之家  ›  专栏  ›  技术社区  ›  Vlad from Moscow

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

  •  5
  • Vlad from Moscow  · 技术社区  · 6 年前

    考虑下面的演示程序。

    #include <iostream>
    
    int main()
    {
        typedef float T;
    
        0.f.T::~T();
    }
    

    本程序由 Microsoft Visual Studio Community 2019 .

    但是 clang 和 gcc

    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 回复  |  直到 6 年前
        1
  •  3
  •   Eric M Schmidt    6 年前

    数字标记的解析非常粗糙,允许许多实际上不是有效数字的东西。在C++ 98中,在[1]中找到了一个“预处理数”的语法。lex.pp编号],是

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

    0.f.T::~T(); 需要标记为 0.f.T :: ~ T ( ) ; 尽管如此 0.f.T 不是有效的数字标记。

    因此,代码是 不 语法上有效。

        2
  •  1
  •   1201ProgramAlarm    6 年前

    用户定义的文字后缀, ud后缀 ,是一个 . 安 标识符

    因此,它是一个编译器错误,因为它正在处理非标识符序列 f.T 作为标识符。

    这个 0. 分数常数 ,后面可以跟一个可选指数,然后 (对于用户定义的文本)或 浮点后缀 (其中之一 fFlL ). 这个 f 可以认为是 同样,但是由于它匹配另一个文本类型,所以应该是that而不是UDL。A ud后缀 在语法中定义为标识符。