gpt4 book ai didi

c++ - 为什么需要 std::move 来调用 std::vector 的 move 赋值运算符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:31 24 4
gpt4 key购买 nike

我正在学习 C++11,我有一个关于 move 语义和右值引用的问题。我的示例代码如下(C++ Shell URL 是 cpp.sh/8gt ):

#include <iostream>
#include <vector>

void aaa(std::vector<int>&& a)
{
std::cout << "size of a before move: " << a.size() << std::endl;
std::vector<int> v;
v = a; /*std::move(a)*/
std::cout << "size of a after move: " << a.size() << std::endl;
}

int main ()
{
std::vector<int> foo (3,0);

aaa(std::move(foo));

return 0;
}

结果是:

size of a before move: 3  
size of a after move: 3

std::vector 的 move 赋值运算符似乎没有在 aaa 函数的 v = a 行调用,否则 a 会大小为 0 而不是 3。
但是,如果我将 v = a 更改为 v = std::move(a),则输出变为

size of a before move: 3
size of a after move: 0

而且我认为这次调用了 std::vector 的 move 赋值运算符。

我的问题是为什么第一次没有调用赋值运算符?根据 c++ 引用,std::vector 有一个赋值运算符,它采用右值引用。

copy (1) vector& operator= (const vector& x);
move (2) vector& operator= (vector&& x);
initializer list (3) vector& operator= (initializer_list il);

然后在 v = a 行,因为 a 被声明为右值引用,所以应该调用 move 运算符。为什么我们仍然需要用 std::move 包装 a?

非常感谢!

[编辑]我认为 Loopunroller 和 Kerrek SB 都回答了我的问题。谢谢!我认为我不能选择两个答案,所以我只选择第一个。

最佳答案

来自 [expr]/6 的注释可能会阐明正在发生的事情(强调我的):

[ Note: An expression is an xvalue if it is:

  • the result of calling a function, whether implicitly or explicitly, whose return type is an rvalue reference to object type,
  • a cast to an rvalue reference to object type,
  • a class member access expression designating a non-static data member of non-reference type in which the object expression is an xvalue, or
  • a .* pointer-to-member expression in which the first operand is an xvalue and the second operand is a pointer to data member.

In general, the effect of this rule is that named rvalue references are treated as lvalues and unnamed rvalue references to objects are treated as xvalues; rvalue references to functions are treated as lvalues whether named or not. — end note ]

根据上面的列表(第一个),不难看出表达式 std::move(a) 是一个 xvalue。
a 是右值引用的名称,因此是作为表达式的左值。

关于c++ - 为什么需要 std::move 来调用 std::vector 的 move 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com