如何与命名构造函数一起处理不可复制的成员

How do deal with noncopyable members in conjunction with named constructors?

本文关键字:处理 可复制 成员 一起 构造函数      更新时间:2023-10-16

Background

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

    IO由于成员
  1. std::ifstream而不可复制的类
  2. Foo具有NamedConstructor的类,喜欢调用复制构造函数

问题

是否有一种模式,我可以在Foo(或等效的东西)中保留NamedConstructor,但我仍然可以将不可复制的成员插入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();
}

这不会在 C++11 中调用复制构造函数,而是调用移动构造函数,这是可以的:

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

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