从 `operator<<` 返回 `<<` 的结果

Returning the result of `<<` from `operator<<`

所有关于 operator<< 的指南都说你应该 return 输出流:

ostream & operator<<(ostream &os, const Foo &x) { os<<"foo"; return os; }

但是就不能简单一点吗?

ostream & operator<<(ostream &os, const Foo &x) { return os<<"foo"; }

如果被调用的 << 遵循指南并且 return 是它的第一个参数,那么它应该是 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 << ")";
}

与我找到的所有替代方案相比,多个 return 使代码更加简单和可读(想象 50 个案例,而不是 3 个)。请注意,缺少 default 允许编译器警告丢失的情况,因此您在添加枚举值时不会忘记添加一个。

假设您使用的重载是 return引用,这些

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;

如果第一句话不成立(例如,调用其他一些不 return 对流对象的引用的自定义重载),那么您将不得不显式地 return流引用或提供不同的重载,如果你仍然想链接这些语句。

由于预计能够链接,您的简化应该有效,如果有问题的 class 定义不符合约定,则编译将失败

任何地方
std::cout << a << b << std::endl;

会起作用,你的简化也会起作用,没有真正的保证就足够了

具体来说,operator << 保证 return 是正确的 ostream