2

バックグラウンド

次の特性を持つコードのチャンクがあります。

  1. IOstd::ifstreamメンバーのためにコピーできないクラス
  2. Fooコピー コンストラクターを呼び出すのが好きな NamedConstructor を持つクラス

質問

NamedConstructor を Foo (または同等のもの) に保持する場合に使用できるパターンはありますが、コピーできないメンバーを Foo に挿入することはできますか?

C++11 の機能/ソリューションを歓迎します。

テストコード

#include <fstream>

class IO
{
        std::ifstream  m_ifs;  // due to this instance, IO is not copyable
};

// #define NEXT_LINE_REQUIRES_IO_MC

class Foo
{
#ifdef NEXT_LINE_REQUIRES_IO_MC
        IO  m_io;
#endif

public:
        static Foo NamedConstructor() {
                return Foo();
        }
private:
        Foo() { }
};

int
main( int argv, char* argc[] )
{
        Foo f = Foo::NamedConstructor();
}
4

1 に答える 1

2

これは C++11 のコピーコンストラクターではなく、ムーブ コンストラクターを呼び出します。これは問題ありません。

  • std::ifstreamC++11 で移動可能
  • IOしたがって、有効なコンパイラ生成のムーブ コンストラクターが含まれます。
  • の copy-constructor または move-constructor を宣言していないためFoo、有効なコンパイラによって生成された move.constructor も含まれます。
  • return ステートメントは、 copy-constructor ではなく、 の move-constructorFoo::NamedConstructorを呼び出しますFoo

ただし、テスト コード (#ifdefコメント アウトされている) は、削除されstd::ifstream(std::ifstream&)た . これは、gcc の標準ライブラリがまだ完全に実装されていないためです (こちらを参照)。

于 2013-09-11T09:58:21.843 に答える