如何与命名构造函数一起处理不可复制的成员
How do deal with noncopyable members in conjunction with named constructors?
Background
我有一段具有以下特征的代码:
std::ifstream
而不可复制的类-
Foo
具有NamedConstructor的类,喜欢调用复制构造函数
IO
由于成员问题
是否有一种模式,我可以在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 中尚未完全实现标准库(见这里)。
相关文章:
- 简单可复制与可简单复制
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 为什么 std::function 本身是可复制构造的类型?
- C++不可复制的 lambda 的行为是可复制的
- 错误:无法通过'...'传递非平凡可复制类型的对象'class boost::filesystem::path'
- 不能让类是微不足道的可复制的。我做错了什么?
- 使用临时存储区复制普通的可复制类型:允许吗
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- 为什么Boost.Asio处理程序必须是可复制的
- 我需要可复制的缓冲区,尽可能轻(例如,不初始化零)