std::move(const shared_ptr reference) 是什么意思?

问题描述 投票:0回答:2

以下是我正在尝试的玩具代码...... 我理解第一个和第二个。第一段代码把所有权给了 _p. 第二份是复印件 p_p但我不明白第三个...

什么是... std::moveconst 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

(更新:添加注释以明确哪一个是第一个,哪一个是第二个,等等)

c++ move shared-ptr
2个回答
2
投票

std::move 只是执行转换并产生x值(r值)。

当被传递一个 const std::shared_ptr<P>,它的返回类型将是 const std::shared_ptr<P>&&. 那么对于 _p(std::move(p))抄写员std::shared_ptr (但不是 调动构造师 其中以r值为参考的 非宪法)会被调用,效果和第二种情况一样。

基本上移动操作倾向于对被移动的对象进行修改,它不应该对以下情况起作用 const 对象。


0
投票

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 没有这样的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.