无符号的用户定义的整数文字

时间:2020-11-09 11:01:19

标签: c++ unsigned-integer user-defined-literals signed-integer negative-integer

假设我要定义一个整数常量,该常量也允许使用负值,例如-12_km

即,我想做

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

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

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

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

2 个答案:

答案 0 :(得分:2)

因为语法中没有负整数文字。让我们抛开问题的用户定义性质。当我们编写-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的一元加号,而不是单独的文字。

答案 1 :(得分:1)

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

因此,您需要重载一元负运算符以使用-12_km

coord_t operator "" _km(unsigned long long);
coord_t operator-();
相关问题