昨日(ストリームの一時オブジェクト)の続きです。内部実装を追ったという話です。
さて、それを実現しているのは、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参照を返しているため、さらに<<や>>を並べても正しく動作するというわけです。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ ストリームの一時オブジェクト その2 実装