考虑一下我有一个包装资源的类:
class B {
public:
B(A res, Stuff stuff) : res(res), stuff(stuff) {}
private:
A res;
Stuff stuff;
};
该类没有副本构造函数或副本分配,因为资源句柄在类A的所有实例之间都必须是唯一的-我们不希望在其他包装对象仍然知道该句柄的情况下释放资源。
现在,我想让其他类通过拥有包装类的成员变量来控制资源:
A loader(std::string filename) {
//open file
Data data;
//read data from file
return A(data);
}
现在考虑一下,在获取资源之前我需要做一些准备。我需要一个加载器函数来处理一些事情,然后返回资源,因为资源所需的数据可以来自计算或例如文件。因此,为使用该文件的Wrapper创建一个构造函数,会将包装器的实现绑定到解析和准备所需数据的方式。我不认为这是明智的。因此,数据的准备工作发生在其他地方,例如:
B b(loader("foo"), stuff);
问题在于A的结构方式,我无法通过以下方式创建B的对象:
{{1}}
因为在B的构造函数中,A的实例获得了一个地址,因此它不再可以绑定到其move构造函数或move赋值运算符的&& a。
如何在不实现复制语义的情况下仍跨多个函数调用和构造函数传递资源句柄?