任意のクラスの>>演算子をオーバーロードする標準的な方法が、タイプ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) または(C++11)に変換できるという追加の利点もありますbool
。これにより、次のような構造のエラーをチェックできます。
while (cin >> x) { ... }
なぜなら、cin >> x>>yのようなものは機能しないからです。そして、これは前の例よりもはるかに頻繁に使用されます。
非常にまれな状況で、(cin >> x) = y;
これが望まれることはありません。左側の変数が返されると予想されます。例: (x += 5) = 7
、「x」が返されてから 7 に設定されます。返されるのは「5」ではありません。したがって、期待される結果は「cin」が返されることであり、これにより、演算子チェーン(cin >> x)
の実装が可能になります。
あなたの: '(cin >> x) = y;' では、予想される読み方は "cin >> x" であり、次に "cin = 7" です。これはあまり意味がありません。他の何かを返すと、期待が満たされないため、コードを読んでいるプログラマーを混乱させるだけです。(最小驚きの原則を参照)
これは、「x y」が常に左辺への参照を返す必要があるという意味ではありません。多くの場合、何か他のものを返す方が理にかなっています。たとえば、'myInt >> 4' は、 'myInt' を右に 4 ビット シフトしたコピーを返します。