我现在正在处理一份代码库,其中有一个部分包含以下内容:
if(const auto *temp_ptr = obj->get_ptr()) {
perm_ptr = std::move(temp_ptr);
}
在这种情况下,
std::move
有什么意义,因为它只是一个简单的指针?似乎与简单地执行perm_ptr = temp_ptr
相比没有任何优势。我现在正在处理一份代码库,其中有一个部分包含以下内容:
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;
}
需要明确的是:这只是一个例子,可能会导致OP呈现的程序有意义且有意义。我不主张使用这种技术。即使这是一个好主意,它仍然会充满注意事项和陷阱,这些内容并未在本答案中涵盖。
std::move
的作用。 - Drew Dormannstd::move
使指针成为右值。而指针作为右值,没有任何区别。 - Drew Dormannperm_ptr = static_cast<typename std::remove_reference<decltype(temp_ptr)>::type&&>(temp_ptr);
一样。 - Ted Lyngmoperm_ptr
是一种自定义的unique_ptr
,具有一个operator=(T*&&)
运算符,以便在调用时清楚地表明所有权从原始指针转移到拥有指针,那么我实际上可以看到这种情况可能是故意的。这是对语法的滥用,但类似的先例已经存在:https://dev59.com/M2gMtIcB2Jgan1znQPjp#mSPtnYgBc1ULPQZFbQ8a - user4442671perm_ptr
也是一个原始指针,那么在这里使用std::move()
就没有意义。但是,如果perm_ptr
是某种具有重载的operator=
的对象,该操作符接受原始指针,则std::move()
可能是有意义的,因为它允许在复制后重置原始指针。 - Remy Lebeau