以下是我正在尝试的玩具代码...... 我理解第一个和第二个。第一段代码把所有权给了 _p
. 第二份是复印件 p
到 _p
但我不明白第三个...
什么是... std::move
的 const shared_ptr &
什么意思?谢谢你
class P { };
class A {
public:
// first one
A(std::shared_ptr<P> &p, int) : _p(std::move(p))
{
std::cout << "1st Ctor: "
<< p.use_count() << ", " << _p.use_count() << std::endl;
}
// second one
A(const std::shared_ptr<P> &p, std::string) : _p(p)
{
std::cout << "2nd Ctor: "
<< p.use_count() << ", " << _p.use_count() << std::endl;
}
// third one
A(const std::shared_ptr<P> &p) : _p(std::move(p))
{
std::cout << "3rd Ctor: "
<< p.use_count() << ", " << _p.use_count() << std::endl;
}
private:
std::shared_ptr<P> _p;
};
int main()
{
{
std::shared_ptr<P> p = std::make_shared<P>();
A a(p, 1);
std::cout << "1. body: " << p.use_count() << std::endl;
}
std::cout << "-------------" << std::endl;
{
std::shared_ptr<P> p = std::make_shared<P>();
A a(p, "2");
std::cout << "2. body: " << p.use_count() << std::endl;
}
std::cout << "-------------" << std::endl;
{
std::shared_ptr<P> p = std::make_shared<P>();
A a(p);
std::cout << "3. body: " << p.use_count() << std::endl;
}
}
结果是
$ ./a.out
1st Ctor: 0, 1
1. body: 0
-------------
2nd Ctor: 2, 2
2. body: 2
-------------
3rd Ctor: 2, 2
3. body: 2
(更新:添加注释以明确哪一个是第一个,哪一个是第二个,等等)
std::move
是一个将参数转换为rvalue引用的函数。函数的调用是一个xvalue表达式,当参数是const的引用时,那么转换结果是一个rvalue到const。
当参数是const的引用时,转换的结果是rvalue到const。如果你从rvalue初始化为const,那么将使用copy constructor,因为rvalue引用参数是向 非宪法 的 move 构造函数不能绑定到 const 的 rvalue 引用参数上。
我认为OP还隐含了一个问题,即如何将
_p(std::move(p))
或有不同_p(p)
_p(std::move(p))
无异 _p(p)
若是 const std::shared_ptr<T>
.
理论上,如果 decltype(_p)
是一个有构造函数的类型 T(const T&&)
那么就会有区别,因为该构造函数将由 _p(std::move(p))
但不以 _p(p)
. 这样的构造函数很不传统,但技术上很完善。std::shared_ptr
没有这样的构造函数。