运算符重载在Visual Studio 2013中编译,但不在gcc中编译

时间:2014-02-13 04:11:08

标签: c++ gcc visual-studio-2013

我有一个班级,我正在重载<<和+这样的运营商:

    friend MyObject operator+(MyObject lhs, MyObject rhs){
        MyObject obj;
        obj.Property = lhs.Property + rhs.Property;
        return obj;
    }

    friend std::ostream& operator<<(std::ostream& os, MyObject& n) {
        os << MyObject.Property;      //property is a double
        return os;
    }

这在Visual Studio和gnu ++ 98中编译都没有问题。我也可以这样称呼它们没有任何问题:

MyObject obj1, obj2;
obj1.PutInValidState();
cout << obj1;
obj1 = obj1 + obj2;

然而,当我同时打电话给他们时:

cout << obj1 + obj2;

Visual Studio将编译它(并提供正确的输出),但是gnu ++ 98给出了错误“不匹配'运算符&lt;&lt;'在''    std :: operator&lt;&lt;(std :: basic_ostream&amp;,const char *)“。我可以通过在函数定义中向参数添加const来编译它,如下所示:

friend std::ostream& operator<<(std::ostream& os, const MyObject& n) {

这里发生了什么?为什么我需要使const在gnu ++ 98中工作,而不是在Visual Studio中工作?

1 个答案:

答案 0 :(得分:2)

cout << obj1 + obj2;

的语法糖
operator<<(cout, operator+(obj1,obj2));

在这里,您可以看到运算符&lt;&lt;()重载中的n参数绑定到operator +()返回的值,该值是临时对象。现在,在C ++中,有一条规则,非const引用参数可以绑定到temporaries,这就是为什么它不能在gcc中编译。

另一方面,Visual Studio具有语言扩展,允许非const引用参数绑定到临时对象。我希望它没有,因为那个扩展是在将代码移植到其他编译器时咬了我的那个。