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

拉胡尔

如果我在当前范围内的堆栈对象上使用std :: move,则将内容移至目标,而将源保留为空。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

int main()
{
    std::string str("stackoverflow");

    std::vector<std::string> vec;
    vec.emplace_back(std::move(str));
    std::cout << "vec[0]: " << vec[0] << std::endl;

    std::cout << "str: " << str << std::endl;
}

结果:

vec[0]: stackoverflow
str: 

如果我将std :: move用作右值或const左值函数参数,则将复制内容。

#include <iostream>
#include <memory>
#include <vector>
#include <utility>

void process_copy(std::vector<int> const & vec_)
{
    std::vector<int> vec(vec_);
    vec.push_back(22);
    std::cout << "In process_copy (const &): " << std::endl;
    for(int & i : vec)
        std::cout << i << ' ';
    std::cout << std::endl;
}

void process_copy(std::vector<int> && vec_)
{
    std::vector<int> vec(vec_);
    vec.push_back(99);
    std::cout << "In process_copy (&&): " << std::endl;
    for(int & i : vec)
        std::cout << i << ' ';
    std::cout << std::endl;
}

int main()
{
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    process_copy(std::move(v));

    std::cout << "In main: " << std::endl;
    for(int & i : v)
        std::cout << i << ' ';
    std::cout << std::endl;
    std::cout << "size: " << v.size() << std::endl;
}

结果:

In process_copy (&&): 
0 1 2 3 4 5 6 7 8 9 99 
In main: 
0 1 2 3 4 5 6 7 8 9 
size: 10

为什么std :: move的行为不同?

蒂莫

您的载体实际上是被复制的,而不是被移动的。这样做的原因是尽管声明为右值引用,但vec_表示函数体内左值表达式。因此,将std::vector调用的副本构造函数,而不是move构造函数。原因是,vec_现在是一个命名值,并且rvalues不能具有名称,因此它会折叠为lvalue。由于以下原因,以下代码将无法编译:

void foo(int&& i)
{
    int&& x = i;
}

为了解决此问题,您必须通过致电再次使自己的vec_ 名字变为无名std::move(vec_)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此函数在给定右值参数的情况下返回左值引用?

来自分类Dev

为什么std :: move没动

来自分类Dev

为什么不能按值将右值std :: stringstream传递给函数?

来自分类Dev

返回const左值引用到右值临时?为什么这样做?

来自分类Dev

为什么std :: max返回错误的值?

来自分类Dev

为什么将表达式强制转换为右值,对函数的引用是左值?

来自分类Dev

为什么返回std :: vector仍在复制?

来自分类Dev

为什么std :: not1()通过const引用而不是值来接受参数?

来自分类Dev

为什么在std :: move中使用std :: remove_reference?

来自分类Dev

为什么std :: move的行为类似于std :: copy?

来自分类Dev

为什么std :: function用作std :: not2的参数?

来自分类Dev

为什么对值传递的参数使用const?

来自分类Dev

为什么`std :: pair`将`std :: tuple`作为ctor参数类型而不是`const std :: tuple&`?

来自分类Dev

为什么 std::make_unique 调用复制构造函数

来自分类Dev

在右值引用参数上使用std :: move的原因

来自分类Dev

为什么在返回此函数时使用std :: move

来自分类Dev

为什么在std :: move之后需要析构函数调用?

来自分类Dev

为什么未调用std :: string move构造函数?

来自分类Dev

为什么要通过右值引用还是按值来获取std :: initializer_list?

来自分类Dev

为什么要通过右值引用还是按值来获取std :: initializer_list?

来自分类Dev

为什么std :: move不要在默认move构造函数中将源变量更改为默认值?

来自分类Dev

为什么需要在move构造函数中将右值引用设置为null?

来自分类Dev

为什么`std :: pair <int,movable>`需要一个[deleted]`const&`复制构造函数?

来自分类Dev

为什么 std::string 的复制构造函数似乎比它的 move 副本更快?

来自分类Dev

为什么 std::string 的复制构造函数似乎比它的 move 副本更快?

来自分类Dev

为什么std :: binary_search返回布尔值?

来自分类Dev

为什么std :: bitset仅采用constexpr值?

来自分类Dev

为什么std :: fetch_add返回旧值?

来自分类Dev

为什么std :: strong_ordering具有“等效”值?

Related 相关文章

  1. 1

    为什么此函数在给定右值参数的情况下返回左值引用?

  2. 2

    为什么std :: move没动

  3. 3

    为什么不能按值将右值std :: stringstream传递给函数?

  4. 4

    返回const左值引用到右值临时?为什么这样做?

  5. 5

    为什么std :: max返回错误的值?

  6. 6

    为什么将表达式强制转换为右值,对函数的引用是左值?

  7. 7

    为什么返回std :: vector仍在复制?

  8. 8

    为什么std :: not1()通过const引用而不是值来接受参数?

  9. 9

    为什么在std :: move中使用std :: remove_reference?

  10. 10

    为什么std :: move的行为类似于std :: copy?

  11. 11

    为什么std :: function用作std :: not2的参数?

  12. 12

    为什么对值传递的参数使用const?

  13. 13

    为什么`std :: pair`将`std :: tuple`作为ctor参数类型而不是`const std :: tuple&`?

  14. 14

    为什么 std::make_unique 调用复制构造函数

  15. 15

    在右值引用参数上使用std :: move的原因

  16. 16

    为什么在返回此函数时使用std :: move

  17. 17

    为什么在std :: move之后需要析构函数调用?

  18. 18

    为什么未调用std :: string move构造函数?

  19. 19

    为什么要通过右值引用还是按值来获取std :: initializer_list?

  20. 20

    为什么要通过右值引用还是按值来获取std :: initializer_list?

  21. 21

    为什么std :: move不要在默认move构造函数中将源变量更改为默认值?

  22. 22

    为什么需要在move构造函数中将右值引用设置为null?

  23. 23

    为什么`std :: pair <int,movable>`需要一个[deleted]`const&`复制构造函数?

  24. 24

    为什么 std::string 的复制构造函数似乎比它的 move 副本更快?

  25. 25

    为什么 std::string 的复制构造函数似乎比它的 move 副本更快?

  26. 26

    为什么std :: binary_search返回布尔值?

  27. 27

    为什么std :: bitset仅采用constexpr值?

  28. 28

    为什么std :: fetch_add返回旧值?

  29. 29

    为什么std :: strong_ordering具有“等效”值?

热门标签

归档