请考虑以下演示程序。
#include <iostream>
int main()
{
typedef float T;
0.f.T::~T();
}
此程序由Community Visual C++ 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()
是否有效?如果没有,那么什么语法规则就被打破了?
用户定义的文字后缀ud-suffix是identifier。 identifier是字母(包括一些非ASCII字符),下划线和不以数字开头的数字的序列。不包括句点字符。
因此它是一个编译器错误,因为它将非标识符序列f.T
视为标识符。
0.
是一个分数常数,后面可以跟一个可选的指数,然后是ud-suffix(对于用户定义的文字)或floating-point-后缀(fFlL
之一)。也可以将f
视为ud-suffx,但是由于它与另一个文字类型匹配,因此应该是那个而不是UDL。 ud-suffix在语法中定义为标识符。