c++ - 关于运算符 + 重载
问题描述
我有以下代码片段:
#include <iostream>
using namespace std;
struct Integer{
int x;
Integer(const int val) : x(val){}
friend Integer operator+(Integer& i, Integer& j){
return Integer(j.x + i.x);
}
friend std::ostream& operator<<(std::ostream& o, Integer i){
o << i.x;
return o;
}
};
int main(){
Integer i(25), j(5), k(2020);
std::cout << (i + j + k);
return 0;
}
为什么不编译?我得到的错误是“'operator+'不匹配(操作数类型是Integer and Integer
)”。为什么会这样?不是从右到左计算的吗?不是, plus which is an(j + k)
结果不应该是显而易见的,意思是 2050 吗?我哪里错了?另外,我的目标是说明为什么该代码段无法编译,以及如何通过最多修改一行代码来使其编译。(这是他们在考试时会问我们的)。谢谢 !Integer(2025)
i
Integer(25)
解决方案
operator+
按值返回,它返回的是一个右值,它不能绑定到非 const 的左值引用,即不能operator+
作为下一个计算的参数传递。
将参数类型更改operator+
为 lvalue-reference 为 const,它可以绑定到 rvalues。
friend Integer operator+(const Integer& i, const Integer& j){
// ^^^^^ ^^^^^
return Integer(j.x + i.x);
}
推荐阅读
- php - 如何使用php将邮件发送到数据库中的多个电子邮件列表
- python - BeautifulSoup 与表
- c - 结构体的全局数组,在程序中声明大小并在不通过的情况下全局使用?
- typescript - 通过向 PromiseLike 添加异常来修改 es6 Promise 类型
- sql - SQL 中的多态关联
- javascript - Javascript 仅适用于 iframe 重新加载
- java - 使用 TYPE 仅选择具有 Inheritance.table_per_class 状态的特定类
- javascript - 将 Google 表格(应用程序脚本)转换为有效的 CSV 格式
- node.js - IBM DevOps Delivery Pipeline 上的当前节点版本在下一阶段丢失
- websocket - 使用 play framework 2.6 创建 websocket