6
4

1 に答える 1

11

basic_ostreamoperator<<次のようなオーバーロードがあります。

template <typename Elem, typename Traits, typename T>
basic_ostream<Elem, Traits>&
    operator<<(basic_ostream<Elem, Traits>&& sink, const T& val)
{
    return sink << val;
}

これは、標準では、§27.7.3.9 [ostream.rvalue] で「Rvalue ストリーム挿入」と呼ばれます。

これにより、右辺値から左辺値への (ある種の) 暗黙的な変換が可能になりますbasic_ostreamこれは、トリックに頼らずに一時ストリームを使用できるようにするために特別に導入されました。


移動を省略したときにコンパイルが失敗する理由については、次のとおりです。

moveなしStream& operator<<(Stream& s, Dummy)でが呼び出されると、から継承されます(つまり)。Streamstd::fstreamstd::ostreambasic_ostream<char>

オーバーロードを使用しbasic_ostream<E, T>& operator<<(basic_ostream<E, T>&, const char*)て文字列を挿入し、その式の結果を返そうとしますostreamstd::ostream&からに暗黙的にダウンキャストすることはできないstd::fstream&ため、エラーが発生します。

独自の行に戻ることでこれを修正できますs(暗黙的にアップキャストされていない場合)。

最初に発見した右辺値から左辺値への挿入演算子を使用するため、これは move の問題ではありません。その関数内では、ストリームは abasic_ostreamStreamあり、戻り値の型も一致します。

于 2013-02-14T01:36:36.643 に答える