我有一个这样的类,其中我像这样重载了<<和+运算符:
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给我错误“ std :: operator <<(std :: basic_ostream&,const char *)中的'operator <<'不匹配” 。我可以通过在函数定义中的参数上添加const来将其编译成两种形式:
friend std::ostream& operator<<(std::ostream& os, const MyObject& n) {
这里发生了什么?为什么我需要const才能使其在gnu ++ 98中工作,而在Visual Studio中却不工作呢?
cout << obj1 + obj2;
是语法糖
operator<<(cout, operator+(obj1,obj2));
在这里,您可以看到n
operator <<()重载中的参数已绑定到operator +()返回的值,该值是一个临时对象。现在,在C ++中,有一个规则,即非const引用参数不能绑定到临时变量,这就是为什么它不能在gcc中编译的原因。
另一方面,Visual Studio具有语言扩展,该语言扩展允许将非const引用参数绑定到临时变量。我希望它不会,因为该扩展是在将代码移植到其他编译器时使我难过的扩展之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句