2

假设我想定义一个整数文字,它也允许负值,例如-12_km.

即,我想做

using coord_t = long long;
coord_t operator "" _km(long long int);

但是,我的编译器(gcc)不接受这一点。

该标准提到了此类文字运算符的参数列表的允许类型列表,但其中没有带符号的整数类型。

为什么标准是这样的?为什么它不允许用户定义的有符号整数文字?

4

2 回答 2

3

因为语法中没有负整数文字。让我们抛开您问题的用户定义性质。当我们写-12时,它是字面12量,它应用了一元-。整数文字的语法定义没有提到减号。

[lex.icon](已编辑和编辑)

integer-literal:
    decimal-literal integer-suffix

decimal-literal:
    nonzero-digit
    decimal-literal digit

nonzero-digit: one of
    1  2  3  4  5  6  7  8  9

digit: one of 
    0 1 2 3 4 5 6 7 8 9

它就在语法中。没有产生负整数文字的产品。这就是为什么用户定义的文字遵循相同的约定。他们的语法生产只是将生产重用于整数文字

[lex.ext]

user-defined-literal:
    user-defined-integer-literal

user-defined-integer-literal:
    decimal-literal ud-suffix

由于否定始终是文字以外的表达式,因此您需要为 . 重载适当的运算符coord_t。顺便说一句,这同样适用于+12. 它是应用于 的一元加号12,而不是文字本身。

于 2020-11-09T11:12:05.017 回答
1

因为 C++ 中没有负整数文字。-12实际上是应用于正文字的减号运算符12。这就是为什么

所以你需要重载一元减号运算符才能使用-12_km

coord_t operator "" _km(unsigned long long);
coord_t operator-();
于 2020-11-09T11:09:28.693 回答