Здесь две вещи:
Matrix(std::vector<std::vector<T>>&& vector2D){ //Move constructor for shallow copy
// Put some error handling to check the validity of vector2D
std::cout<<"Move Constructor Called ...\n";
data = vector2D;
//vector2D = nullptr; // we should assign the original reference to null in my knowledge
}
1) Вы должны переместить полученный вектор, чтобы вызвать операторы назначения перемещения векторов:
data = std::move(vector2D);
2)нет необходимости вручную устанавливать вектор на nullptr, его состояние уже правильно установлено.Вектор, из которого вы перемещаетесь, остается в «неизвестном, но действительном состоянии», поэтому вы можете делать с ним все, что не предполагает предварительных условий (переназначение, проверка размера, проверка на пустоту и т. Д., Однако вы не можете ожидать, что оноимеют действительные значения внутри).Как уже упоминалось в другом ответе, вы должны также напрямую инициализировать данные, вместо того, чтобы делать это в теле конструктора, поэтому, наконец, конструктор должен быть реализован следующим образом:
Matrix(std::vector<std::vector<T>>&& vector2D) : data(std::move(vector2D)) {}