将用户定义的文字与方法调用相结合

时间:2013-10-16 03:52:01

标签: c++ c++11 user-defined-literals

我想知道为什么我不能写这样的代码:

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

2 个答案:

答案 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...此时,“ - ”之后的余数将作为后缀标识符传递。

请记住,数字文字在预处理程序标记化之后被解释为

我认为这实际上不是缺陷。