以下是我正在尝试的玩具代码...我理解第一个和第二个。第一个将所有权赋予_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
是将参数转换为右值引用的函数。该函数调用是一个xvalue表达式。
当参数是对const的引用时,则转换结果是对const的右值。如果从rvalue初始化为const,将使用复制构造函数,因为move构造函数的非const的rvalue引用参数无法绑定到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
没有这样的构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句