问题描述
假设我要定义一个整数常量,该常量也允许使用负值,例如-12_km
。
即,我想做
using coord_t = long long;
coord_t operator "" _km(long long int);
但是,我的编译器(gcc)不接受。
The standard提到了此类文字运算符的参数列表的允许类型列表,但其中没有带符号整数类型。
为什么这样的标准?为什么不允许使用用户定义的带符号整数文字?
解决方法
因为语法中没有负整数文字。让我们抛开问题的用户定义性质。当我们编写-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
就在语法那里。没有产生负整数文字的产生。这就是为什么用户定义的文字遵循相同的约定的原因。他们的语法产生只是简单地将产生重新用于整数文字
user-defined-literal: user-defined-integer-literal user-defined-integer-literal: decimal-literal ud-suffix
由于否定符始终是非文字的表达式,因此您需要为coord_t
重载适当的运算符。顺便说一句,+12
同样适用。这是应用于12
的一元加号,而不是单独的文字。
因为C ++中没有负整数文字。 -12
实际上是应用于正文字12
的负运算符。这就是原因
- -9'223'372'036'854'775'808LL is unsigned
- we must define
INT_MIN
as-INT_MAX - 1
-
-2147483648 > 0
和0 < -0x80000000
在某些编译器中
因此,您需要重载一元负运算符以使用-12_km
coord_t operator "" _km(unsigned long long);
coord_t operator-();