GNU gcc 4.3 は、今後の c++0x 標準を部分的にサポートします。実装された機能の中には、右辺値参照があります。右辺値参照を使用すると、コピー不可能なオブジェクトを移動したり、関数からオブジェクトを返したりすることが可能になります。
std::streamsは右辺値参照によって既に移動可能ですか、それとも現在のライブラリの実装には何かが欠けていますか?
現在の g++ svn では、右辺値参照のサポートはまだストリームに追加されていません。追加するのはさほど難しいことではないと思いますし、オープンソース ソフトウェアの場合と同様に、パッチは大歓迎です!
簡単な調査の結果、右辺値参照のサポートがまだストリームに追加されていないことがわかりました。
関数からコピー不可能なオブジェクトを返すには、移動コンストラクターを次のように実装するだけで十分です。
struct noncopyable
{
noncopyable()
{}
// move constructor
noncopyable(noncopyable &&)
{}
private:
noncopyable(const noncopyable &);
noncopyable &operator=(const noncopyable &);
};
このようなコンストラクターは、所有権を新しいオブジェクトに転送し、渡されたオブジェクトをデフォルト状態のままにすることになっています。
つまり、次の方法で関数からオブジェクトを返すことができます。
noncopyable factory()
{
noncopyable abc;
return std::move(abc);
}
std::stream は移動コンストラクターをサポートしていませんが、gcc 4.3.2 に同梱されている STL コンテナーは既にそれをサポートしているようです。