【问题标题】:How do I define a negative UDL in c++11 (are they disallowed?)?如何在 c++11 中定义负 UDL(它们是否被禁止?)?
【发布时间】:2013-02-05 00:55:49
【问题描述】:

我什至不确定是否允许使用负用户定义文字。如果没有,为什么他们被排除在外?

例如,我想使用:

auto money_i_owe_jack = -52_jpy;

这是我使用 gcc 4.7.2 尝试过的:

constexpr int64_t operator "" _jpy(long long l)
{
  return static_cast<int64_t>(l);
}

错误

Test_udl.cpp:60:47: error: ‘constexpr int64_t operator"" _jpy(long long int)’ has invalid argument list

【问题讨论】:

  • 你试过了吗?我认为他们是允许的
  • @balki - 是的,我遇到编译错误 - 稍后会更新 OP... ...实际上,由于long double,一个负数也可以,但我不能无法接受long long - 让我再试一次。
  • 你用的是什么编译器? It's not very widely supported yet.
  • 负号不是文字的一部分。它是一个操作符,作用于文字的返回值。因此,您的 UDL 函数返回的类型需要定义一元 operator-
  • @BenjaminLindley ty - 如果你能告诉我如何解决这个问题作为答案/例子,我可以接受

标签: c++ c++11 user-defined-literals


【解决方案1】:

无论用户定义还是其他方式,整数和浮点字面量始终为正数。

原因很简单:如果您允许使用否定字面量,则词法分析变得依赖于上下文。也就是说,当面对- 10 之类的东西时,词法分析器不能仅仅孤立地查看该文本并知道它应该被视为两个单独的标记(-10)还是一个(-10 )。如果您总是将其视为单个标记,那么像 a - 10 这样的东西会导致 &lt;a&gt;&lt;-10&gt;(即 &lt;identifier&gt;&lt;literal&gt;,这不是 C++(或大多数其他编程语言)中的合法序列。

为了解决这个问题,解析器可以向词法分析器提供一些上下文,告诉在任何给定时刻是否期望(例如)一个运算符或一个操作数,所以它会知道如果它要产生一个运算符,- 应该被视为它自己的令牌,但如果需要一个操作数,-10 将是一个单一的令牌。

一般来说,始终遵循一条规则会更容易,其中一个有效的方法是 - 始终是一个运算符,而文字根本不能包含 -

【讨论】:

  • +1 很好地解释了为什么文字是它们的方式 - ty
  • 另外,一元 operator- 是可重载的,因此单独处理它更有意义。
【解决方案2】:

整数文字需要被接受为unsigned long long。负号不是文字的一部分,它是在事后应用到返回值上的。

constexpr int64_t operator "" _jpy(unsigned long long l)
{
  return static_cast<int64_t>(l);
}

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 2019-11-06
    • 2014-09-24
    • 2015-12-31
    • 2011-04-14
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多