c++ - c++ 运算符重载 += 有效,但 << 无效
问题描述
我预计 += 和 << 会起作用,但 << 不知何故不起作用。
这是我的代码:
#include <iostream>
using namespace std;
struct Pos{
int x;
int y;
void operator+=(Pos vel){
x += vel.x;
y += vel.y;
}
};
struct Obj{
string name;
Pos pos;
void info(){
cout << name << endl;
cout << pos.x << ", " << pos.y << endl;
cout << endl;
}
void operator<<(Pos vel){
pos += vel;
}
void operator+=(Pos vel){
pos += vel;
}
};
int main(){
Pos p{10, 20};
Obj car{"Car", p};
Obj truck{"Big truck", {40, 20}};
car.info();
truck.info();
//doesn't work
car << {0, 10};
//works
car += {5, 10};
//works
car << Pos{0, 10};
//works
car += Pos{5, 10};
car.info();
}
他们中的大多数都有效,但是
car << {0, 10};
表明:
[Error] expected primary-expression before '{' token
我想知道使用构造函数之间有什么区别+=
以及<<
为什么会起作用。
我在这里想念什么?
解决方案
这:{10, 20}
是一个花括号初始化列表。它不是一个表达式。因此,它只能出现在特定的 C++ 语法片段中。
例如,braced-init-lists 可以出现在类型名之后,这意味着它们初始化该类型的纯右值。它们可以作为函数的参数出现。并且(在其他几个中)它们可以出现在赋值运算符的右侧。
请注意,这+=
是一个赋值运算符。
<<
不是这些特定的地方之一。因此,一个赤裸的大括号初始化列表不能出现在<<
表达式的任何一侧。<<
这与表达式将被转换为调用的事实无关,operator<<
因此花括号初始化列表可以被视为函数参数。C++ 语法根本不允许在那里出现花括号初始化列表,因此编译器永远不会走得足够远,甚至无法尝试重载决议来确定要调用哪个函数。
推荐阅读
- python-3.x - 如何使 timeit.Timer() 与 itertools.starmap() 的输出一起工作
- karate - 空手道 GET 调用中未返回 Content-Encoding 响应标头
- mysql - 如何优化以下查询以及什么是(使用 where;使用连接缓冲区(块嵌套循环))与 EXPLAIN
- typescript - 如果未提供所有对象键,如何使用给定值更新对象
- c# - C# 到节点加密散列 - md5 和 sha256
- javascript - 编写使用立即调用函数表达式 (IIFE) 的代码来创建指示的斐波那契函数
- flutter - 在flutter中点击设备返回按钮时刷新返回页面
- xml - powershell 中的 Save() 正在破坏 xml 文件
- javascript - 在同一台服务器上获取多个数据库
- python - 在 macOS 上从我的 Python 代码打开屏幕键盘