【发布时间】:2013-09-14 23:54:00
【问题描述】:
背景
我有一段代码具有以下特点:
-
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();
}
【问题讨论】:
-
你考虑过使用一些智能指针吗?
-
你所拥有的应该在 C++11 中编译得很好,因为
ifstream是可移动的,因此IO也应该是。但是,我只是用 MinGW (gcc 4.8) 对其进行了测试,它显然没有编译,抱怨删除了移动构造函数。如果你有同样的问题,这是一个错误。 -
@BenjaminLindley 废话 - 我认为你是对的,根据之前的帖子:stackoverflow.com/a/4846927/975129 fwiw,我使用的是 gcc 4.7.3
-
@kfmfe04:在此期间,您可能应该接受 Basile 的建议,并使用
unique_ptr<ifstream>。 -
@BenjaminLindley ty,我会试试的。顺便说一句,编译器生成的移动构造函数应该在上面的 sn-p 中给我正确的行为,对吧?由于 NamedConstructor 的 rhs 无论如何都会消失(甚至可能通过 RVO),我认为我是安全的。 (我根本没有玩过移动构造函数......)