假设我想定义一个整数文字,它也允许负值,例如-12_km
.
即,我想做
using coord_t = long long;
coord_t operator "" _km(long long int);
但是,我的编译器(gcc)不接受这一点。
该标准提到了此类文字运算符的参数列表的允许类型列表,但其中没有带符号的整数类型。
为什么标准是这样的?为什么它不允许用户定义的有符号整数文字?
假设我想定义一个整数文字,它也允许负值,例如-12_km
.
即,我想做
using coord_t = long long;
coord_t operator "" _km(long long int);
但是,我的编译器(gcc)不接受这一点。
该标准提到了此类文字运算符的参数列表的允许类型列表,但其中没有带符号的整数类型。
为什么标准是这样的?为什么它不允许用户定义的有符号整数文字?
因为语法中没有负整数文字。让我们抛开您问题的用户定义性质。当我们写-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
。这就是为什么
所以你需要重载一元减号运算符才能使用-12_km
coord_t operator "" _km(unsigned long long);
coord_t operator-();