kfm*_*e04 7 c++ user-defined-literals c++11
我甚至不确定是否允许使用负面的用户定义文字.如果没有,为什么他们被排除在外?
例如,我想使用:
auto money_i_owe_jack = -52_jpy;
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用gcc 4.7.2:
constexpr int64_t operator "" _jpy(long long l)
{
return static_cast<int64_t>(l);
}
Run Code Online (Sandbox Code Playgroud)
错误
Test_udl.cpp:60:47: error: ‘constexpr int64_t operator"" _jpy(long long int)’ has invalid argument list
Run Code Online (Sandbox Code Playgroud)
无论是用户定义的还是其他,整数和浮点文字总是正数.
原因很简单:如果允许负面文字,lexing就会变得依赖于上下文.也就是说,当遇到类似的东西时- 10,词法分析器不能单独查看该文本,而是知道它是否应该被视为两个单独的标记(-和10)或一个(-10).如果你总是将它视为一个单一的标记,那么a - 10就会产生类似的结果<a>(即<-10>,这不是C++(或大多数其他编程语言)中的合法序列).
为了解决这个问题,解析器可以向词法分析器提供一些上下文,在任何给定时刻告知是否期望(例如)运算符或操作数,因此它会知道如果要生成运算符,则<identifier><literal>应该对其进行处理作为自己的标记,但如果预期操作数,-则将是单个标记.
拥有一个始终遵循的规则通常要容易得多,而且一个有效的方法-10是始终是一个操作符,而文字根本不包含任何一个-.
需要接受整数文字unsigned long long.负号不是文字的一部分,它是在事实之后应用于返回的值.
constexpr int64_t operator "" _jpy(unsigned long long l)
{
return static_cast<int64_t>(l);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |