我正在尝试为具有两个仅移动成员的类编写移动构造函数。难点在于其中一个成员拥有对另一个成员的引用,因此一旦它们被移动,其中一个成员就会引用一个不再存在的对象:
class Server : noncopyable
{
};
class Client : noncopyable
{
public:
Client(Server& server) : server_(server) {}
Client(Client&& other) : server_(std::move(other.server_)) {}
std::reference_wraper<Server> server_;
};
class MyClass : noncopyable
{
public:
MyClass()
: server_(),
client_(server_) {}
// destroys other.server_ which client uses before and after move
MyClass(MyClass&& other)
: server_(std::move(other.server_)),
client_(std::move(other.client_))
private:
Server server_;
Client client_;
};
有没有办法处理这种情况?基本上,当引用对象本身移动时,引用对象需要将其引用更新为移动版本。
答案 0 :(得分:2)
解决此问题的最简单方法是亲吻MyClass
再见的价值成员。
如果你只是在这里使用std::unique_ptr<Server>
和std::unique_ptr<Client>
,那么其余的就很自然了 - 因为Server
对象本身永远不会被移动,而只有MyClass
对象的指针被{{{ 1}},您无需更新Client
中的任何内容。