Ale*_*ban 6 c++ user-defined-literals c++11
我想知道为什么我不能写这样的代码:
constexpr double radius = 27_km.to_miles(); // _km returns Distance instance
// which has to_miles()
Run Code Online (Sandbox Code Playgroud)
GCC 4.8.1和Clang 3.4都抱怨他们找不到文字运算符,operator"" _km.to_miles除非我27_km用括号括起来:
constexpr double radius = (27_km).to_miles(); // fine
Run Code Online (Sandbox Code Playgroud)
通过阅读标准的2.14.8节,UDL后缀不能包含句点,那么为什么编译器会像这样解析代码呢?它们是正确的还是错误的?
编辑:你可以在这里看到一个完整的例子(使用不同的UDL和方法名称):http://ideone.com/rvB1pk
这可能是词法分析器问题。用户定义的文字将被标记为单个块 - 数字加后缀是一个完整的标记。在数字文字的情况下,允许使用的字符包括小数点“.”。查找 pp-number:第 2.10 节 -标准最新草案中的 lex.ppnumber。演练预处理器(词法分析器)如何扫描令牌:
30_au.to_light_years()
digit
digit
identifier-nondigit
.
identifier-nondigit x 14
( breaks the spell
Run Code Online (Sandbox Code Playgroud)
因此预处理器将其视为30_au.to_light_years一个大的怪异(浮点)数。然后,在数字解析阶段,我们看到digit, digit, identifier-nondigit... 此时,从“-”开始的余数将作为后缀标识符传递。
请记住,数字文字是在预处理器标记化之后解释的。
我觉得这其实并不是一个缺陷。