C++ std::move(const shared_ptr reference)是什么意思?
以下是我正在尝试的玩具代码。。。我理解第一个和第二个。第一个将所有权授予C++ std::move(const shared_ptr reference)是什么意思?,c++,c++11,shared-ptr,move-semantics,stdmove,C++,C++11,Shared Ptr,Move Semantics,Stdmove,以下是我正在尝试的玩具代码。。。我理解第一个和第二个。第一个将所有权授予\u p。第二个将p复制到\u p。 但我不明白第三个 const shared&的std::move是什么意思?多谢各位 类P{}; 甲级{ 公众: //第一个 A(std::shared_ptr&P,int):_P(std::move(P)) { std::cout只执行转换并生成xvalue(rvalue) 当传递一个const std::shared\u ptr时,它的返回类型将是const std::shared\
\u p
。第二个将p
复制到\u p
。
但我不明白第三个
const shared&
的std::move
是什么意思?多谢各位
类P{};
甲级{
公众:
//第一个
A(std::shared_ptr&P,int):_P(std::move(P))
{
std::cout只执行转换并生成xvalue(rvalue)
当传递一个const std::shared\u ptr
时,它的返回类型将是const std::shared\u ptr&&
。然后对于\u p(std::move(p))
将调用std::shared\u ptr
(但不调用对非const的右值引用),其效果与第二种情况相同
基本上,move操作倾向于对正在移动的对象执行修改;它不应该对const
对象起作用。std::move
是一个将参数转换为右值引用的函数。函数调用是一个xvalue表达式
当参数是对常量的引用时,转换的结果是从右值到常量。如果从右值初始化到常量,将使用复制构造函数,因为移动构造函数的非常量的右值引用参数不能绑定到对常量的右值引用参数
我认为OP也有一个隐含的问题,\u p(std::move(p))
与\u p(p)
\u p(std::move(p))
与const std::shared\u ptr的情况下的\u p(p)
没有区别
理论上,如果decltype(_p)
是一个具有构造函数T(const T&&)
的类型,那么就会有区别,因为该构造函数将由_p(std::move(p))
调用,而不是由_p(p)调用
。这样的构造函数将非常不传统,但在技术上结构良好。std::shared\u ptr
没有这样的构造函数。您可能应该更清楚“第一个”(第一行,第一个块,对std::move
的第一次调用?)。这同样适用于你的问题:你所说的“std::move
ofconst shared\u ptr&
”是什么意思?引用具体的行。在我的团队中,在代码审查中,第一、第二和第三都会被定为不好的做法。对于转让所有权a(std::shared\u ptr&&P)
(这对于共享的ptr来说有点奇怪),或者a(std::shared_ptrP)
(任何接收器参数的典型模式)这是表达意图的一种方式。@Eljay,谢谢你的评论。你的建议使用起来更清晰。通过你的评论,我发现const shared\u ptr&
在复制/移动方面似乎有点模棱两可。@ericconst shared\u ptr&
显然不适合移动。我认为OP也有一个隐含的问题,即\u p(std::move(p))
可能不同于\u p(p)
@M.M我认为没有必要提及\u p(p)
也有一个副本。我已经添加了澄清。好的。我想对于具有单独的const T&
和T&
constructors@M.M确实是这样。你有没有看到过顺便说一句使用的const T&
构造函数?我在非构造函数中见过几次,但从来没有在构造函数中见过。谢谢你的帮助注释。我试图继承std::shared_ptr
并在copy-ctor和move-ctor上打印。正如您所回答的,当参数为const-shared_ptr&
时,copy-ctor被调用!!
$ ./a.out
1st Ctor: 0, 1
1. body: 0
-------------
2nd Ctor: 2, 2
2. body: 2
-------------
3rd Ctor: 2, 2
3. body: 2