注册 登录
编程论坛 C++教室

求教一个unique_ptr指针赋值的问题

Potheads 发布于 2021-04-14 15:10, 1642 次点击
unique_ptr指针不通常能被赋值,下面这个代码是一个匿名对象被赋值给了其他的unique_ptr指针:


unique_ptr<string> p;
p = unique_ptr<string>(new string("Hello"));

似乎是可以的,匿名对象可以被赋予到其他的指针,想请问下原理是什么,匿名对象似乎也不是一个即将消亡的对象。
多谢帮助!!!
4 回复
#2
rjsp2021-04-14 15:33
参见 https://zh.
只看第一行也可以了
unique_ptr& operator=( unique_ptr&& r ) noexcept;

unique_ptr 接受 unique_ptr&& 的赋值操作。
如果你要赋值的是左值的话,那就用 std::move,例如
    unique_ptr<string> p;
    auto x = unique_ptr<string>(new string("Hello"));
    p = std::move(x);
#3
Potheads2021-04-14 16:31
感谢版主,有点思路了,您的代码:

auto x = unique_ptr<string>(new string("Hello"));  中,

实际上 unique_ptr<string>(new string("Hello")); 被编译器视为右值, 赋给 x 时,是调用移动赋值运算符将右值的资源移动给了左值。所以视unique_ptr<string>(new string("Hello"));为右值而不是将亡值。

这样理解就对了吧?
#4
rjsp2021-04-14 16:35
回复 3楼 Potheads
不是“赋给 x”,那儿虽然用的是“=”,但实际调用的是构造函数。
我重给你份代码吧,你要关注的是 p = std::move(x); 这一句

程序代码:
#include <memory>
#include <string>
using namespace std;

int main( void )
{
    unique_ptr<string> x( new string("Hello") );

    unique_ptr<string> p;
    p = std::move(x);
}
#5
Potheads2021-04-14 16:48
感谢感谢!! 我明白您的意思,move这个我应该可以理解,我的困惑在于new出来的unique_ptr是左值还是右值。从  auto x = unique_ptr<string>(new string("Hello")); 看来,“=”右边的
表达式因为是个“匿名”对象,所以编译器视其为右值,虽然随其所在函数的返回,“匿名”的unique_ptr对象会释放其资源,但我们不能视其为将亡值,因为在函数结束前,已经通过:
auto x = unique_ptr<string>(new string("Hello")); 将其资源截获,所以本质上其是个右值。

请您指正。
1