我现在正在使用代码库,本节包含以下内容:
if(const auto *temp_ptr = obj->get_ptr()) {
perm_ptr = std::move(temp_ptr);
}
在这种情况下,当
std::move
只是一个简单的指针时,它有什么意义呢?看起来比简单地做没有任何优势perm_ptr = temp_ptr
?
正如评论中所说,如果
perm_ptr
的类型是原始指针类型,那么移动就没有意义。
但是,可以为
perm_ptr
定义一个类型,从而使该语法变得有意义。它是否有用充其量是有很大争议的,并且会导致不直观和非常规的代码。
它涉及定义一个只接受指向指针的 RValue 的赋值运算符。就像这样:
operator=(T*&& p);
.
例如,这可以用于确保没有人意外地将原始指针分配给最终会在无意中调用
delete
的对象。
它也可用于将指针重置为
nullptr
(或其他值)作为赋值的一部分。
#include <utility>
template<typename T>
struct my_unique_ptr {
~my_unique_ptr() {
if(ptr_) delete ptr_;
}
my_unique_ptr& operator=(T*&& p) {
ptr_ = p;
p = nullptr;
return *this;
}
private:
T* ptr_ = nullptr;
};
int main() {
my_unique_ptr<int> perm_ptr ;
int* ptr = new int;
// all good.
owning_ptr = std::move(ptr);
// compile error!
owning_ptr = ptr;
}
100% 明确:这只是一个可能导致 OP 提出的计划有意且有意义的示例。我并不提倡这种技术。即使这是一个好主意,它仍然充满了本答案未涵盖的警告和陷阱。
这里是UB。在 if 语句中赋值