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
of
const shared\u ptr&
”是什么意思?引用具体的行。在我的团队中,在代码审查中,第一、第二和第三都会被定为不好的做法。对于转让所有权
a(std::shared\u ptr

&&P)

(这对于共享的ptr来说有点奇怪),或者
a(std::shared_ptr

P)

(任何接收器参数的典型模式)这是表达意图的一种方式。@Eljay,谢谢你的评论。你的建议使用起来更清晰。通过你的评论,我发现
const shared\u ptr&
在复制/移动方面似乎有点模棱两可。@eric
const 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