Я думал, что когда я удалю конструктор перемещения в B
, следующий код все равно будет компилироваться, так как он должен все же взять конструктор копирования для построения объектов B
. Почему компилятор теперь жалуется. Без =delete
это не так и называется конструктор копирования в любом случае, так как это не было разрешено предоставлять конструктор перемещения по умолчанию!)Отказ от копирования конструктора не работает?
class B{
public:
B(){}
~B(){}
B & operator=(const B & b){
std::cout << " cannot move -> copy " << std::endl;
return *this;
}
B(const B & v){
std::cout << " cannot move -> copy " << std::endl;
}
// B(B && b) = delete; // uncomment this!
};
int main()
{
B b(B{});
}
Compiler Output с лязгом 3,6 (Live code)
main.cpp:27:7: error: call to deleted constructor of 'B'
B b(B{});
^~~~
main.cpp:21:5: note: 'B' has been explicitly marked deleted here
B(B && b) = delete;
^
1 error generated.
«Функция не определена» и «функция определена как удаленная» - это не одно и то же. Последнее означает, что функция участвует в разрешении перегрузки нормально, тогда возникает ошибка, если она действительно выбрана. –
ah ups, thanks :-) – Gabriel