I have the following 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;
};
I would like to test my move-constructor. So I tried to do :
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
But then I saw that it was my copy-constructor that was called and not the move-constructor. Do you have any idea why ?