不对重载的operator +参数执行隐式转换?

时间:2018-08-03 04:56:13

标签: c++11

所有代码均在带有-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行应如下所示:

  
      
  1. 唯一的Point::operator+const Direction&作为唯一参数。因为可以{1,1}被隐式转换为Direction类型的对象,就像将f({1,2})评估为f(Point{1,2})一样。尽管此对象是临时的,但这无关紧要,因为参数为const
  2.   
  3. int f(const Point& p)将此临时“ Point {2,4}”作为参数并返回6
  4.   输出
  5. 6,然后输出'\n'
  6.   

但事实并非如此。

隐式转换对重载运算符不起作用吗?但我们知道并非如此,因为以下代码确实可以正常工作,并在我的系统中输出了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行中的表达式?

谢谢。

0 个答案:

没有答案