1 に答える
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*)て文字列を挿入し、その式の結果を返そうとしますostream。std::ostream&からに暗黙的にダウンキャストすることはできないstd::fstream&ため、エラーが発生します。
独自の行に戻ることでこれを修正できますs(暗黙的にアップキャストされていない場合)。
最初に発見した右辺値から左辺値への挿入演算子を使用するため、これは move の問題ではありません。その関数内では、ストリームは abasic_ostreamでStreamあり、戻り値の型も一致します。