【发布时间】:2021-09-08 19:39:08
【问题描述】:
如果我有一个最初由 AManager 拥有的只移动类,可以通过 obtain 转移给另一个所有者,通过 release 返回给 AManager。
class AManager;
class A {
public:
A(const A& other) = delete;
const A& operator=(const A&) = delete;
A(A&& other);
A& operator=(A&& other);
private:
AManager& _manager;
bool _isValid;
};
class AManager {
public:
A obtain() {
return std::move(_instance);
}
void release(A a) {
_instance = std::move(a);
}
private:
A _instance;
};
A 在自己的析构函数中移动自己是否有效?即,当 A 被销毁时,将自己释放回其管理器是否有效?
A::~A() {
if (_isValid) {
_manager.release(std::move(*this));
}
}
假设 A 类有一些方法可以知道它是否处于有效状态。例如,我添加了一个有效标志。我相信 unique_ptr 使用的指针是否为空。
【问题讨论】:
-
我不明白为什么会神奇地不允许它。这只是一个完全正常的函数调用,您通过右值引用将对象传递给它。
-
它是否打算让
A具有附加功能?所以A将负责其主要目的和 负责确保资源返回到AManager?一堂课有两个任务? -
嗯...移动
*this的想法可能需要将此问题与近乎重复的问题分开,但您仍可能需要查看Usage of "this" in destructor 和Validity of "this" in destructor。 -
为什么要编写充满未定义行为且难以理解的代码。从它的析构函数到
move *this完全没有意义。 -
@Phil1970 将
*this移动到_instance不会导致_instance与已被销毁的对象完全相同。相反,它会导致_instance成为*this的副本,并且可以选择非常有效地完成此副本。然而,你在一个问题的边缘跳舞:当经理被摧毁时会发生什么?经理被销毁后,其成员也被销毁,包括_instance。当_instance被销毁时,它可能会尝试将自己释放给不再有效的管理器。