gpt4 book ai didi

c++ - 调用复制构造函数而不是移动构造函数

转载 作者:行者123 更新时间:2023-11-30 02:21:31 27 4
gpt4 key购买 nike

我有以下类(class):

class Component {
public:
// Constructor
explicit Component(const void* data, size_t size)
: _size(size),
_data(new int[_size]) {
(void)memcpy(_data, data, _size);
}

// Destructor
~Component() {
delete[] _data;
}

// Copy-ctor.
Component(const Component& o)
: _size(o._size),
_data(new uint8_t[_size]) {
(void)memcpy(_data, o._data, _size);
}

// Assignment operator
Component& operator=(const Component& o) {
if (this != &o) {
delete[] _data;
_size = o.getSize();
_data = new uint8_t[_size];
(void)memcpy(_data, o.getData(), _size);
}
return *this;
}

// Move-constructor
Component(Component&& o)
: _size(o._size),
_data(o._data) {
o._data = nullptr;
}

// Move assignment
Component& operator=(Component&& o) {
if (this != &o) {
delete[] _data;
_size = o._size;
_data = o._data;
o._data = nullptr;
}
return *this;
}

private:
size_t _size;
int _data;
};

我想测试我的移动构造函数。所以我尝试这样做:

void f(Component&& c) {
Component c2 = c; // Expect to use move-constructor
}
int data[] = { 0, 1 };
Component c{&data[0], sizeof(data)};
f(std::move(c)); // getting a rvalue reference from lvalue reference

但后来我发现调用的是我的复制构造函数,而不是移动构造函数。你知道为什么吗?

最佳答案

在这段代码中

void f(Component&& c)
{
Component c2 = c; // Expect to use move-constructor
}

c 是一个左值。这就是让您可以在 f 中多次使用它的原因。

&& 参数表明调用者将不再需要该对象,您可以随意掠夺它。但是现在你的函数在概念上是所有者......你调用的子程序不应该掠夺你的对象,除非你依次授予它们权限。

使 c 成为右值会破坏许多用例,例如:

void f(string&& s)
{
string inputfilename = s + ".in";
string outputfilename = s + ".out";
// use s in some other ways
}

要授予子程序获取参数的权限,您可以使用 std::move

关于c++ - 调用复制构造函数而不是移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48228987/

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