关于operator<<
的所有指南说你应该返回输出流:
ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; }
但是就不能简单一点吗?
ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; }
如果调用<<
遵循指南并返回其第一个参数,那么它应该 100% 相同。但我是否依赖于一些没有保证的东西?在某些情况下会失败吗?
我为什么想要它?不仅仅是为了节省击键次数(我们不在 codegolf.SE 中) 实际用法有点复杂:
enum class Foo { A, B, C };
ostream & operator<<(ostream &os, const Foo &x) {
switch (x) {
case A: return os << "A";
case B: return os << "B";
case C: return os << "C";
}
return os << "Bad Foo (" << (int)x << ")";
}
与我找到的所有替代方案相比,多次返回使代码更加简单和可读(想象 50 个案例,而不是 3 个)。注意缺少default
允许编译器警告缺少的情况,这样您在添加枚举值时就不会忘记添加一个。
最佳答案
假设您使用的重载返回一个引用,这些
ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; }
ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; }
将具有相同的效果并允许通常的链接
cout << Foo::A << Foo::B;
如果第一句话不成立(例如,调用其他一些不返回对流对象的引用的自定义重载),那么您必须显式返回流引用或提供不同的重载(如果您仍然这样做)想要链接这些语句。
关于c++ - 从 `<<` 返回 `operator<<` 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170560/