如何与命名构造函数一起处理noncopyable成员?

时间:2013-09-11 05:03:36

标签: c++ c++11

背景

我有一大堆具有以下特征的代码:

    由于IO成员而无法复制的
  1. std::ifstream
  2. Foo具有NamedConstructor的类,它喜欢调用复制构造函数
  3. 问题

    我可以使用哪种模式将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();
    }
    

1 个答案:

答案 0 :(得分:2)

这不会调用C ++ 11中的 copy 构造函数,而是移动构造函数,这是好的:

  • std::ifstream可在C ++ 11中移动
  • 因此,
  • IO将拥有一个有效的编译器生成的move-constructor
  • 因为你没有为Foo声明一个copy-constructor或move-constructor,所以它也会有一个有效的编译器生成的move.constructor。
  • Foo::NamedConstructor中的return语句将调用Foo的move-constructor,而不是copy-constructor

但是,您的测试代码(注释掉#ifdef)尚未在gcc 4.8上编译,因为它想要使用已删除的std::ifstream(std::ifstream&)。这是由于gcc中尚未完全实现的标准库(参见here)。