背景
我有一大堆具有以下特征的代码:
IO
成员而无法复制的std::ifstream
类
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();
}
答案 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)。