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::ifstream在 C++11 中是可移动的
  • IO因此将有一个有效的编译器生成的移动构造函数
  • 由于您没有为 声明复制构造函数或移动构造函数Foo,因此它也会有一个有效的编译器生成 move.constructor 。
  • 中的 return 语句Foo::NamedConstructor将调用Foo移动构造函数,而不是复制构造函数

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

于 2013-09-11T09:58:21.843 回答