标题:求教一个unique_ptr指针赋值的问题
只看楼主
Potheads
Rank: 2
等 级:论坛游民
帖 子:4
专家分:10
注 册:2021-4-14
结帖率:0
已结贴  问题点数:20 回复次数:4 
求教一个unique_ptr指针赋值的问题
unique_ptr指针不通常能被赋值,下面这个代码是一个匿名对象被赋值给了其他的unique_ptr指针:


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

似乎是可以的,匿名对象可以被赋予到其他的指针,想请问下原理是什么,匿名对象似乎也不是一个即将消亡的对象。
多谢帮助!!!
搜索更多相关主题的帖子: string 指针 赋值 对象 其他 
2021-04-14 15:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
参见 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);
2021-04-14 15:33
Potheads
Rank: 2
等 级:论坛游民
帖 子:4
专家分:10
注 册:2021-4-14
得分:0 
感谢版主,有点思路了,您的代码:

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

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

这样理解就对了吧?
2021-04-14 16:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 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);
}
2021-04-14 16:35
Potheads
Rank: 2
等 级:论坛游民
帖 子:4
专家分:10
注 册:2021-4-14
得分:0 
感谢感谢!! 我明白您的意思,move这个我应该可以理解,我的困惑在于new出来的unique_ptr是左值还是右值。从  auto x = unique_ptr<string>(new string("Hello")); 看来,“=”右边的
表达式因为是个“匿名”对象,所以编译器视其为右值,虽然随其所在函数的返回,“匿名”的unique_ptr对象会释放其资源,但我们不能视其为将亡值,因为在函数结束前,已经通过:
auto x = unique_ptr<string>(new string("Hello")); 将其资源截获,所以本质上其是个右值。

请您指正。
2021-04-14 16:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505451-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024258 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved