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

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

ems*_*msr 2

这可能是词法分析器问题。用户定义的文字将被标记为单个块 - 数字加后缀是一个完整的标记。在数字文字的情况下,允许使用的字符包括小数点“.”。查找 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... 此时,从“-”开始的余数将作为后缀标识符传递。

请记住,数字文字是预处理器标记化之后解释的。

我觉得这其实并不是一个缺陷。