У меня есть этот небольшой фрагмент (скомпилированный с помощью g++), в котором я определил конструктор перемещения:
#include <iostream>
using namespace std;
class A {
public:
A() = delete;
A(int value) : value(value) {}
void operator=(const auto &other) = delete;
~A() { cout << "Destructor called..." << endl; }
A(const auto &other) {
cout << "Copy constructor called..." << endl;
value = other.value;
}
A(const A &&other) {
cout << "Move constructor called..." << endl;
value = other.value;
}
private:
int value;
};
int main() {
A p1(2);
A p2(p1);
return 0;
}
Насколько я понимаю, существует соглашение компилятора о неявном удалении любых операций копирования при определении конструктора перемещения. Они должны быть явно определены, если они нужны пользователю.
Поскольку auto будет преобразован в A, по какой причине компилятор все еще считает этот конкретный конструктор удаленным?
«Поскольку auto будет преобразовано в A»: объявление «функции» с заполнителем (auto) в параметрах — это не функция, а шаблон функции. Это не разрешится просто A. Он будет принимать любой тип в качестве аргумента в конструкции. И, как говорится в ответе, шаблоны функций никогда не могут быть конструкторами копирования, так что все еще есть неявный, который удаляется и лучше соответствует разрешению перегрузки (потому что это не шаблон).
Поскольку auto будет преобразовано в A, по какой причине компилятор все еще считает этот конкретный конструктор удаленным?
(выделено мной)