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

埃里克

以下是我正在尝试的玩具代码...我理解第一个和第二个。第一个将所有权赋予_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

(更新:添加评论以澄清哪个是第一个,第二个,等等)

埃雷里卡

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

std :: transform中的[] const_iterator :: value_type是什么意思

来自分类Dev

是否存在从std :: shared_ptr <T>到std :: shared_ptr <const T>的隐式转换?

来自分类Dev

std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

来自分类Dev

使用std :: vector <std :: shared_ptr <const T>>是反模式吗?

来自分类Dev

使用std :: shared_ptr的std :: map调用const重载函数

来自分类Dev

使用std :: vector <std :: shared_ptr <const T>>是反模式吗?

来自分类Dev

C ++ 11 std :: shared_ptr工作正常,但是boost :: shared_ptr崩溃了,这是什么原因引起的?

来自分类Dev

有什么办法可以正确地std :: move const数据吗?

来自分类Dev

为什么在我for(auto&it:myUnorderedMap){... = std :: move(it.second)}时得到const引用?

来自分类Dev

为什么std :: move复制右值或const左值函数参数的内容?

来自分类Dev

有什么办法可以正确地std :: move const数据吗?

来自分类Dev

生成std :: thread时的shared_ptr参考计数

来自分类Dev

C ++ std :: shared_ptr参考的reinterpret_cast优化

来自分类Dev

通过值或const ref传递std :: shared_ptr,然后将其存储在容器中?

来自分类Dev

std :: shared_ptr的use_count递增的所有方式是什么?

来自分类Dev

std :: shared_ptr的use_count递增的所有方式是什么?

来自分类Dev

std :: unique_ptr :: release()与std :: move()

来自分类Dev

const std :: shared_ptr&const正确性

来自分类Dev

(const char * restrict,...)是什么意思?

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

在我使用shared_ptr之后,抛出“ std :: bad_weak_ptr的实例后调用终止”是什么

来自分类Dev

参数std :: unique_ptr <T> &&的std :: move或std :: forward

来自分类Dev

std :: begin和std :: end的const重载的目的是什么?

来自分类Dev

std :: shared_ptr什么时候释放其对象?

来自分类Dev

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不编译?

来自分类Dev

std :: enable_if_t = 0是什么意思

来自分类Dev

gcc 信息页面中的“-std=standard”是什么意思?

Related 相关文章

  1. 1

    使用std :: move与std :: shared_ptr

  2. 2

    std :: transform中的[] const_iterator :: value_type是什么意思

  3. 3

    是否存在从std :: shared_ptr <T>到std :: shared_ptr <const T>的隐式转换?

  4. 4

    std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

  5. 5

    使用std :: vector <std :: shared_ptr <const T>>是反模式吗?

  6. 6

    使用std :: shared_ptr的std :: map调用const重载函数

  7. 7

    使用std :: vector <std :: shared_ptr <const T>>是反模式吗?

  8. 8

    C ++ 11 std :: shared_ptr工作正常,但是boost :: shared_ptr崩溃了,这是什么原因引起的?

  9. 9

    有什么办法可以正确地std :: move const数据吗?

  10. 10

    为什么在我for(auto&it:myUnorderedMap){... = std :: move(it.second)}时得到const引用?

  11. 11

    为什么std :: move复制右值或const左值函数参数的内容?

  12. 12

    有什么办法可以正确地std :: move const数据吗?

  13. 13

    生成std :: thread时的shared_ptr参考计数

  14. 14

    C ++ std :: shared_ptr参考的reinterpret_cast优化

  15. 15

    通过值或const ref传递std :: shared_ptr,然后将其存储在容器中?

  16. 16

    std :: shared_ptr的use_count递增的所有方式是什么?

  17. 17

    std :: shared_ptr的use_count递增的所有方式是什么?

  18. 18

    std :: unique_ptr :: release()与std :: move()

  19. 19

    const std :: shared_ptr&const正确性

  20. 20

    (const char * restrict,...)是什么意思?

  21. 21

    QVariant与std :: shared_ptr

  22. 22

    QVariant与std :: shared_ptr

  23. 23

    在我使用shared_ptr之后,抛出“ std :: bad_weak_ptr的实例后调用终止”是什么

  24. 24

    参数std :: unique_ptr <T> &&的std :: move或std :: forward

  25. 25

    std :: begin和std :: end的const重载的目的是什么?

  26. 26

    std :: shared_ptr什么时候释放其对象?

  27. 27

    为什么std :: shared_ptr <T> = std :: unique_ptr <T []>编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不编译?

  28. 28

    std :: enable_if_t = 0是什么意思

  29. 29

    gcc 信息页面中的“-std=standard”是什么意思?

热门标签

归档