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