C++中直接从operator<<返回ostream是否合法?是否存在问题?
关于C++中ostream输出重载直接返回链式调用结果的问题
当然可以!这种写法完全符合C++标准,而且是非常简洁的惯用写法,不存在任何合规性问题。
为什么这种写法可行?
原因很简单:C++标准库中,ostream的所有operator<<重载(包括内置类型、标准库类型的重载),返回值都是**ostream&——即对原输出流对象的引用**。
当你写出os << foo.a << foo.b这样的链式调用时,执行顺序是:
- 先调用
os << foo.a,返回os的引用; - 接着用这个引用调用
<< foo.b,仍然返回os的引用; - 整个表达式最终的结果就是
os本身的引用。
所以直接返回这个表达式的结果,和你先执行输出语句再单独return os的写法,行为完全等价。
两种写法的对比
原来的写法:
ostream& operator<<(ostream& os, Foo foo) { os << foo.a << foo.b; return os; }
简化后的写法:
ostream& operator<<(ostream& os, Foo foo) { return os << foo.a << foo.b; }
这两段代码在编译和运行时没有任何区别,后者只是把输出和返回合并成了一行,更紧凑。
额外说明
这种链式返回的设计正是C++流操作的核心特性之一——你平时常用的cout << "Hi" << 123 << endl;本质上就是靠不断返回流对象的引用实现的。只要你自定义的operator<<都遵循标准规范(返回ostream&),这种写法就完全安全可靠。
唯一需要注意的是:如果某个operator<<重载错误地返回了ostream值(而不是引用),那链式调用会产生临时对象,此时直接返回就会出问题,但这种情况本身就是不符合流操作规范的错误写法,和你的这种简化写法无关。
内容的提问来源于stack exchange,提问作者Voko
相关产品推荐
相关产品推荐

