C++ 重载流运算符、引用参数和匿名实例

c++ overloading stream operator, parameters by reference and anonymous instances

本文关键字:实例 参数 引用 重载 运算符 C++      更新时间:2023-10-16

如果我有一个带有重载流运算符的 POD:

struct Value{
...
    friend ostream& operator<< (ostream &out, Value &val);
...
};

我不能将流运算符用于匿名实例。例如,我不能做:

cout<<Value();

这给了我:

error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Value’)

另一方面,我可以按值传递 POD,但我想避免复制。有没有办法两者兼而有之?

Value v1;
cout<<v1<<" "<<Value()<<endl;

由于运算符不应修改正确的操作数,因此应通过引用const来获取它:

friend ostream& operator<< (ostream &out, const Value &val);

const引用可以绑定到临时引用,因此它将起作用(标准库也是这样做的)。