昨日(ストリームの一時オブジェクト)の続きです。内部実装を追ったという話です。


さて、それを実現しているのは、C++の標準ライブラリに新しく追加された以下の関数です。

template <class charT, class traits, class T>
basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>&& is, T& x)
{
  return is >> x;
}
 
template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x)
{
  return os << x;
}

basic_istreamに対する>>とbasic_ostreamに対する<<、計2つの関数です。

通常、>>演算子や<<演算子では、basic_istreamやbasic_ostreamのlvalue参照型(&の参照型)を引数に取ります。そのため、一時オブジェクト (prvalue) を渡せないのでした。そこで、このようにrvalue参照型(&&の参照型)の多重定義を追加したのです。

いったんrvalue参照型の変数で受け取ってしまえば、xvalueになります。xvalueならlvalue参照に渡せるので、関数定義にあるreturn文内の<<や>>は期待した通りに動作します。しかも、lvalue参照を返しているため、さらに<<や>>を並べても正しく動作するというわけです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ ストリームの一時オブジェクト その2 実装