6

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

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

4

2 回答 2

3

UDL 的后缀应该是一个普通的标识符(带有前导下划线),所以对我来说它看起来像一个错误。

于 2013-10-16T04:04:49.813 回答
2

这可能是一个词法分析器问题。用户定义的文字将被标记为单个块 - 数字加后缀是一个完整的标记。在数字文字的情况下,允许啜饮的字符包括十进制“.”。查找 pp-number:第 2.10 节 -最新标准草案中的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... ,从“-”开始的剩余部分作为后缀标识符传递。

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

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

于 2013-10-17T05:02:04.373 回答