所有代码均在带有-std = c ++ 11选项的g ++ 6.4.0上编译。 请考虑以下内容:
#include<iostream>
using std::cout;
using std::endl;
struct Direction{
int dx,dy;
};
struct Point{
int x,y;
Point operator+(const Direction& d){
return {x+d.dx,y+d.dy}
}
};
int g(const Direction& d){
return d.dx+d.dy;
}
int f(const Point& p){
return p.x+p.y;
}
int main(){
cout << g({1,2}) << endl;
cout << f({1,2}) << endl;
Point A {1,3};
cout << f(A+{1,1}) << endl; //line 25
}
编译器抱怨
25 |错误:“ {”令牌
之前的预期主表达式
删除第25行后,程序运行良好,输出两个3
分隔的两个'\n'
。
但是,我有点困惑。
据我所知,第25行应如下所示:
- 唯一的
Point::operator+
以const Direction&
作为唯一参数。因为可以{1,1}
被隐式转换为Direction
类型的对象,就像将f({1,2})
评估为f(Point{1,2})
一样。尽管此对象是临时的,但这无关紧要,因为参数为const
。- 输出
int f(const Point& p)
将此临时“Point {2,4}
”作为参数并返回6
。6
,然后输出'\n'
。
但事实并非如此。
隐式转换对重载运算符不起作用吗?但我们知道并非如此,因为以下代码确实可以正常工作,并在我的系统中输出了98
:
#include<iostream>
int main(){
std::cout << 1 + 'a' << std::endl;
}
我还考虑了在一行中进行两次隐式转换的可能性,但是下面的代码可以编译:
int main(){ //line 21: continued from the code at the top
cout << g({1,2}) + f({1,2}) << endl;
}
我的问题是:
1。为什么第25行出现错误
2。以及我还应该定义什么以便可以保留第25行中的表达式?
谢谢。