Ben*_*_TW 6 c++ oop operator-overloading
我希望+ =和<<将相同,但是<<不起作用。
这是我的代码:
#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();
}
Run Code Online (Sandbox Code Playgroud)
他们大多数工作,但
car << {0, 10};
表明:
[Error] expected primary-expression before '{' token
Run Code Online (Sandbox Code Playgroud)
我不知道是什么样的区别+=和<<为什么使用构造函数将工作。
我在这里想念什么?
这{10, 20}是一个大括号初始化列表。这不是一种表达。因此,它只能出现在特定的C ++语法中。
例如,braced-init-lists可以出现在类型名之后,这意味着它们会初始化该类型的prvalue。它们可以作为函数的参数出现。并且(除其他外)它们可以出现在赋值运算符的右侧。
请注意,这+=是一个赋值运算符。
<<是不是这些具体的地方之一。因此,裸括号初始列表不能出现在<<表达式的任何一侧。这与<<表达式将转换为对的调用无关,operator<<因此braced-init-list可以视为函数参数。C ++语法根本不允许在其中出现括号启动列表,因此编译器永远也走不了足够的距离,甚至无法尝试重载解析来找出要调用的函数。
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |