10

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

例如,我想使用:

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
4

2 回答 2

16

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

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

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

但是,通常更容易拥有始终遵循的单个规则,并且有效的规则是 the-始终是运算符,而文字根本不能包含 a -

于 2013-02-20T05:40:18.647 回答
7

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

constexpr int64_t operator "" _jpy(unsigned long long l)
{
  return static_cast<int64_t>(l);
}
于 2013-02-20T05:33:30.483 回答