So, I'm currently plodding along attempting to learn more of "Modern C++" -- using the STL, etc.
Please see the code below (compiling for Adafruit ESP32 Feather Huzzah). It defines a class that contains a dynamically allocated data member. An object of this class is instantiated and then a copy of the object is placed in a std:vector<> using Move Semantics.
The Serial port output is shown below the code and is exactly what I expected -- the object is first constructed and then a copy placed into the vector via the Move Constructor. Also, as expected, the Move Assignment Operator is not called at all.
Here's the question …. if I comment out the Move Assignment Operator, the code fails to compile with the error message attached (can't include inline --- exceeds character limit). So, why does the Move Assignment Operator need to be implemented if it's not even called?
Thanks.
Code:
#include "Arduino.h"
class MyClass {
public:
MyClass() : id(objectCounter++), data(new uint8_t[10]) {
printf("Constructing: %d\n", id);
}
MyClass(MyClass &&source) : id(objectCounter++), data(source.data) {
source.data = nullptr;
printf("Move Constructing: %d From: %d\n", id, source.id);
}
~MyClass() {
delete[] data;
printf("Destructing: %d\n", id);
}
MyClass &operator=(MyClass &&rhs) { // <------ Must be present even though never called ?????
delete[] data;
data = rhs.data;
rhs.data = nullptr;
printf("Move Assigning: %d From: %d\n", id, rhs.id);
return *this;
}
MyClass(const MyClass &source) = delete;
MyClass &operator=(const MyClass &rhs) = delete;
private:
uint8_t id;
uint8_t *data;
static uint8_t objectCounter;
};
uint8_t MyClass::objectCounter = 0;
void setup() {
std::vector<MyClass> vect;
Serial.begin(115200);
delay(1000);
MyClass object0;
vect.insert(vect.end(), std::move(object0));
}
void loop() {
}
Serial Port Output:
Constructing: 0
Move Constructing: 1 From: 0
Destructing: 0
Destructing: 1
ErrorMessage.txt (8.16 KB)