0

< <とC++の>>演算子のオーバーロードの例を紹介しました。それを実装するすべての例は、ローカル変数にフレンド関数からローカル変数の参照を返す

class Date 
{ 
    int mo, da, yr; 
public: 
    Date(int m, int d, int y) 
    { 
     mo = m; da = d; yr = y; 
    } 
    friend ostream& operator<<(ostream& os, const Date& dt); 
}; 

ostream& operator<<(ostream& os, const Date& dt) 
{ 
    os << dt.mo << '/' << dt.da << '/' << dt.yr; 
    return os; 
} 

int main() 
{ 
    Date dt(5, 6, 92); 
    cout << dt; 
} 

を参照を返すように見えるしかし、私は(それがない場合には何とか、私を修正)、OSがローカル変数だと思う疑問を得ました。

このコードが実際に動作するのかどうかわかりませんが、ウェブ上のほとんどの参照で同様の実装が見つかりました。

注:ヘッダーファイルのインクルードと名前空間のstdステートメントの使用は、意図的に省略されています。

ありがとうございます。

+2

それは '参照ではなく、ローカル変数 – JLev

+6

ですos'はローカル変数ですが、参照するオブジェクトはローカル変数ではありません。 – VTT

+1

1.ローカル変数ではありません。友人はそれとは何の関係もありません。 – juanchopanza

答えて

3

私はosがローカル変数だと思います(もしそうでなければ、私を修正してください)。

実際にはありません。 osはローカル参照ですが、それは本当です。しかし、それは非ローカルオブジェクトにバインドされています。

これは非const値の参照であるため、関数呼び出しの寿命を超えるオブジェクトにバインドする必要があります。したがって、関数から返された参照への参照は完全に大丈夫です。何もぶら下がることはありません。

実際には、それはあなたが関数の連鎖通話を可能にするために何をしなければならないかです:

std::cout << foo << bar << baz; 

は、機能のちょうど束です呼び出します。

operator<<(operator<<(operator<<(std::cout, foo), bar), baz); 
+0

ありがとうございました。 :) –

+0

@KrishnaKumar [私の質問に誰かが答えるときはどうすればいいですか?](https://stackoverflow.com/help/someone-answers)トピックをご覧ください。 – Ron

+0

これは100%ではありません。関数に渡されたパラメータがrvalueであれば、ぶら下がっている可能性があります。 @OriBS - これは、MSVCの場合にのみ右辺値にすることができます。たとえば、次のようになります。std :: ostream&wrong = std :: operator <<(std :: stringstream()、 "Hello World")); – OriBS

関連する問題