假设我想定义一个整数文字,它也允许负值,例如-12_km
。
也就是说,我想做
using coord_t = long long;
coord_t operator "" _km(long long int);
但是,我的编译器(gcc)不接受这一点。
The standard提到了此类文字运算符的参数列表允许的类型列表,但其中没有有符号整数类型。
为什么标准是这样的?为什么它不允许用户定义的有符号整数文字?
最佳答案
因为语法中没有负整数文字。让我们先把问题的用户定义性质放在一边。当我们编写-12
时,它是文字12
,它应用了一元-
。整数文字的语法定义不包含减号。
[lex.icon] (redacted and edited)
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++ - 无符号用户定义整数文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64750374/