gpt4 book ai didi

c++ - move 构造函数和 std::move 混淆

转载 作者:可可西里 更新时间:2023-11-01 18:20:01 25 4
gpt4 key购买 nike

我正在阅读 std::move , move 构造函数和 move 赋值运算符。老实说,我现在得到的只是困惑。现在我有一个类:

class A{
public:
int key;
int value;
A(){key = 3; value = 4;}
//Simple move constructor
A(A&& B){ A.key = std::move(B.key);
A.value = std::move(B.value);}
};
  1. 我认为 B 是右值引用,为什么可以将 std::move 应用于 ravlue 引用的成员?
  2. B.keyB.value 被 move 后,两者都已失效,但是如何将 B 作为类 A 失效了吗?
  3. 如果我有 A a(A()) 怎么办,A() 显然是一个 rvlaue,可以 move A()通过 std::move 为什么?
  4. 同样,如果我有一个函数

    int add(int && z){
    int x = std: move (z);
    int y = std: move (z);
    返回x+y;
    }

如果我调用 add(5) 怎么办,5 怎么 move ?为什么?并且注意到z被 move 了两次,z第一次被 move 后就失效了,怎么再 move 呢?

  1. 在定义foo (T && Z )时(T, Z 可以是任何东西),在定义体中 Why in earth我应该使用 std::move(Z),因为 Z 已经由右值引用传递,我什么时候应该使用 std::move

最佳答案

您必须了解 std::move 不会 move 任何东西,但会将其参数“标记”为右值引用。从技术上讲,它将类型转换为右值引用。然后,右值引用被相应的 move 构造函数或 move 赋值运算符 move 。对于仅包含具有平凡 move 构造函数/赋值运算符的成员的对象, move 构造函数/赋值运算符是平凡的并且只是复制。通常,对象的 move 构造函数/赋值运算符调用其所有成员的 move 构造函数/赋值运算符。

所以,无论何时你写

int x = 10;int y = std::move(x); 

在赋值 y = std::move(x) 的右侧,您有一个 int&& 类型的右值引用。但是,int 没有非平凡的 move 构造函数,右值只是简单地复制到 y 中,x 中没有任何改变。

另一方面,

string s = "some string";string moved_s = std::move(s); // here we tell the compiler that we can "steal" the resource of s

是不同的。 moved_s 的 move 构造函数启动,并“窃取”(即交换内部指针等)s 的资源,因为后者是右值引用。最后,s 将不包含任何元素。

关于c++ - move 构造函数和 std::move 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27497830/

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