从"运算符<<返回"<<"的结果
Returning the result of `<<` from `operator<<`
关于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;
如果第一句话不成立(例如,调用其他自定义重载,该重载不返回对流对象的引用),那么如果您仍然想链接这些语句,则必须显式返回流引用或提供不同的重载。
由于它被期望能够链接,因此简化应该有效,并且如果有问题的类定义不遵循约定,则在编译时会失败
所在的任何地方
std::cout << a << b << std::endl;
如果没有真正的保证,简化就足够了
具体地说,在您的问题中,字符串文字的operator <<
被保证返回正确的ostream
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在更改for循环的第三部分后,未使用for循环结果
- <<操作员在下面的行中工作
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时