为任何类重载 >> 运算符的标准方法返回 istream(或任何输入流)类型的对象是否有充分的理由。
例如,由于这个原因,代码如下
y = (cin >> x) ;
>>
如果重载具有输入对象的返回类型,它将不起作用。
为任何类重载 >> 运算符的标准方法返回 istream(或任何输入流)类型的对象是否有充分的理由。
例如,由于这个原因,代码如下
y = (cin >> x) ;
>>
如果重载具有输入对象的返回类型,它将不起作用。
例如,由于这个原因,代码如下
(cin >> x) = y;
不会工作。如果重载 >> 具有输入对象的返回类型,它将具有。
不,它不一定 - 在很多情况下你会看到error: lvalue required as left operand of assignment
,除非你返回一个参考。(点击这里进行演示)
一般的原因是它允许链接,例如做类似的事情
mystream >> a >> b >> c;
对于输入/输出流,还有一个额外的好处是可以将流转换为void*
(C++03) 或bool
(C++11),这允许检查构造中的错误,例如
while (cin >> x) { ... }
因为那时像 cin >> x >> y 这样的东西就行不通了。这比前面的例子使用得更频繁。
在极少数情况下(cin >> x) = y;
是需要的。预计左侧变量是要返回的变量。示例:(x += 5) = 7
, 'x' 被返回,然后设置为 7 - '5' 不是返回的。所以(cin >> x)
'cin' 的预期结果是返回,它允许实现operator chaining。
在您的:'(cin >> x) = y;'中,预期的阅读方式是“cin >> x”,然后是“cin = 7”。这没有多大意义。返回其他内容只会让阅读您的代码的程序员感到困惑,因为他们的期望没有得到满足。(见最小惊讶原则)
这并不意味着 'x y'总是需要返回对左侧的引用。通常,返回其他内容可能更有意义。例如,'myInt >> 4' 返回一个向右位移 4 位的 'myInt'的副本。