gpt4 book ai didi

c++11 为什么这个 move 构造函数不起作用?

转载 作者:行者123 更新时间:2023-12-03 23:30:46 24 4
gpt4 key购买 nike

我已经编写了下面发布的代码。我希望能够在 LargeClass 的实例之间 move 向量的内容。正在使用 move 构造函数,但我只获得副本而不是 move 。

为什么 move 语义在这里没有按预期工作?

代码:

#include <iostream>
#include <vector>

class LargeClass
{
public:
explicit LargeClass (void): numbers(20, 10)
{
}
LargeClass (const LargeClass &rhs): numbers(rhs.numbers)
{
std::cout << "Using LargeClass copy constructor" << '\n';
}
LargeClass (const LargeClass &&rhs): numbers(std::move(rhs.numbers))
{
std::cout << "Using LargeClass move constructor" << '\n';
}

const int* getNumbersAddress(void) const
{
return (numbers.data());
}

private:
std::vector<int> numbers;
};

int main()
{
LargeClass l1;
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';

LargeClass l2(l1);
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';

LargeClass l3 = std::move(l2);
std::cout << "l1 vector address: " << l1.getNumbersAddress() << '\n';
std::cout << "l2 vector address: " << l2.getNumbersAddress() << '\n';
std::cout << "l3 vector address: " << l3.getNumbersAddress() << '\n';

return 0;
}

可能的输出:

l1 vector address: 0x18ce010
Using LargeClass copy constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
Using LargeClass move constructor
l1 vector address: 0x18ce010
l2 vector address: 0x18ce070
l3 vector address: 0x18ce0d0

最佳答案

右值引用在它们的 const 形式中没有意义,因为你想修改它们(你想“move ”它们)。在 C++ 中创建为 const 的对象位于只读内存中,无法从中获取/修改内部资源。

move 构造函数的语法normally应该是

  • class_name (class_name &&)

所以使用:

LargeClass (LargeClass&& rhs)

关于c++11 为什么这个 move 构造函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484680/

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