c++ - 为什么对箭头 (->) 运算符的调用失败?
问题描述
考虑以下代码:
#include <iostream>
class Test
{
public:
Test() : a{ 0 }
{}
void print() const
{
std::cout << "a : " << a << std::endl;
}
void operator->()
{
a = 5;
}
void operator++()
{
++a;
}
public:
int a;
};
int main()
{
Test a;
a.print();
// Increment operator
a.operator++(); // CORRECT
++a; // CORRECT
a.print();
// Indirection operator
a.operator->(); // CORRECT
a->; // INCORRECT
a.print();
}
为什么对第二个->
接线员的调用不正确?我知道这种用法->
不同于一般用法,但标准不允许这种用法吗?
解决方案
CPP 标准草案 (N4713) 中关于从重载运算符访问类成员的小节说明了这一点:
16.5 重载运算符
...
16.5.6 类成员访问 [over.ref]
1.operator->
应为不带参数的非静态成员函数。它实现了使用->
.postfix-expression -> template(opt) id-expression //This!! postfix-expression -> pseudo-destructor-name
如果存在并且运算符被重载决策机制(16.3)选择为最佳匹配函数,则表达式
x->m
被解释为类型(x.operator->())->m
的类对象。x
T
T::operator->()
如您所见,如果运算符重载,id-expression
则非常需要。->
推荐阅读
- google-api - 用于从 google fit api 捕获每日步数的 API 调用
- excel - 如何循环通过合并的单元格(并从一维数组中填充值)?
- python - 在 swagger 文件配置中,可以在路径中获取 2 个参数
- c++ - glUniform1ui 的成本
- assembly - 如何检查文件路径是否存在
- c# - 如何在 ASP.Net Core MVC 模型中使用 C# 解析来自 rest api 的 json 数据并将其显示在 HTML 页面上
- ios - iOS:用户对用户订阅的应用内购买?
- git - Git - 是否可以获取与本地分支关联的拉取请求?
- javascript - rxjs订阅在被重写时是否被破坏?
- batch-rename - 如何修复重命名方法?“系统找不到指定的文件”