2016-11-09 9 views
1

私はOverloading the Stream Insertion Operator (<<)についての記事を読んでいました。オペレータが正しくカスケード接続されるように、出力ストリームオブジェクトを返す必要があることを強調しています。しかし、それは返品なしのようだ、出力はまだ正しいです、何が間違っている?ストリーム挿入演算子をカスケードすると動作しません

#include<iostream> 

class Rational 
{ 
    friend std::ostream& operator<<(std::ostream&, const Rational&); 

    private: 
     int numerator; 
     int denominator; 
    public: 
     Rational(int num, int den): numerator{num}, denominator{den} {} 
}; 

std::ostream& operator<<(std::ostream& lhs, const Rational& rhs) 
{ 
    lhs << rhs.numerator << "/" << rhs.denominator; 
    //return lhs; 
} 

int main() 
{ 
    Rational r1(3, 5); 
    std::cout << "The value of r1 is " << r1 << std::endl; // After commenting return lhs; still works fine 
} 

答えて

2

これはUBです。オブジェクトを返すと想定される関数は、return文なしで終了します。うまくいくかもしれませんが、何も保証されていません。標準、$6.6.3/2 The return statement [stmt.return]から

CV void戻り型がreturnとと等価であると(強調鉱山)

コンストラクタ、デストラクタ、または機能の端を流れますオペランドはありません。そうでない場合は、mainbasic.start.main)以外の関数の終了を外しての結果はとなります。


あなたはclangからの結果を確認します。その警告

警告与える:無限再帰内の制御は、非ボイド関数の終わりに到達[-Wreturn型]

、結果を。

0

実際、この関数には未定義の動作があります。ストリームへの参照をレジスタ(EAXなど)に格納し、このレジスタをコンパイラが戻り値を渡すために使用するためかもしれません。

関連する問題