【问题标题】:Unsigned user-defined integer literal无符号用户定义整数文字
【发布时间】:2020-11-09 11:01:19
【问题描述】:

假设我想定义一个整数文字,它也允许负值,例如-12_km.

也就是说,我想做

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      所以你需要重载一元减号运算符才能使用-12_km

      coord_t operator "" _km(unsigned long long);
      coord_t operator-();
      

      【讨论】:

      • 我有using coord_t = long long;,当我尝试以这种方式定义一元减号operator 时,编译器会出错。有什么办法吗?
      • @TimKuipers 为什么不声明类就重载? coord_t 必须是结构或类。您还应该更改名称,因为以 _t 结尾的名称在 POSIX 中被保留:What are the rules about using an underscore in a C++ identifier?Does the ISO 9899 standard has reserved any use of the _t suffix for identifiers?。事实上coord_t 也是一个常见的名字,所以你很有可能会发生名字冲突
      • 还有Boost.Units,如果可能的话,您可以使用它来避免自己重新定义 unist
      • 感谢_t 信息。 coord_t 不是类或结构,它是基本类型 long long 的类型名。
      • @TimKuipers 这是因为你的coord_t 只是long long 的别名
      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多