c++ - 无符号用户定义整数文字

标签 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提到了此类文字运算符的参数列表允许的类型列表,但其中没有有符号整数类型。

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

最佳答案

因为语法中没有负整数文字。让我们先把问题的用户定义性质放在一边。当我们编写-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

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

[lex.ext]

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/

相关文章:

c++ - 如何根据单个用户定义的文字自动添加文字定义?

c++11 - 用户定义的字符串文字的长度作为模板参数?

C++ 默认构造函数

c++ - 警告 :"pointless comparison of unsigned integer with zero"cuda

c++ - 采用字符数组的 constexpr 函数的正确定义是什么?

c - 如何在 c 中打印一个 unsigned int*?

c++ - 如何将 16 位 unsigned int 转换为 8 位 unsigned char 并最终返回 unsigned char*?

c++ - std::thread 请解释输出

c++ - 将虚函数声明设置为零?

C++分配标准?