我想知道为什么我不能写这样的代码:
constexpr double radius = 27_km.to_miles(); // _km returns Distance instance
// which has to_miles()
GCC 4.8.1和Clang 3.4都抱怨他们找不到文字运算符operator"" _km.to_miles
,除非我将27_km
括在括号中:
constexpr double radius = (27_km).to_miles(); // fine
通过阅读标准的2.14.8节,UDL后缀不能包含句点,那么为什么编译器会像这样解析代码呢?它们是正确的还是错误的?
编辑:您可以在此处查看完整示例(使用不同的UDL和方法名称):http://ideone.com/rvB1pk
答案 0 :(得分:3)
UDL的后缀应该是普通的标识符(带有前导下划线),所以它看起来像是一个bug。
答案 1 :(得分:2)
这可能是词法问题。用户定义的文字将被标记为单个块 - 数字加后缀是一个完整的标记。在数字文字的情况下,允许其上升的字符包括小数“。”。查找pp-number:第2.10节 - 标准latest draft中的lex.ppnumber。了解预处理器(词法分析器)如何扫描令牌:
30_au.to_light_years()
digit
digit
identifier-nondigit
.
identifier-nondigit x 14
( breaks the spell
因此预处理器将30_au.to_light_years
视为一个巨大的怪异(浮点)数字。然后稍后,在数字解析阶段,我们看到digit, digit, identifier-nondigit...
此时,“ - ”之后的余数将作为后缀标识符传递。
请记住,数字文字在预处理程序标记化之后被解释为。
我认为这实际上不是缺陷。