Насколько я знаю, брошенные объекты копируются по умолчанию. Поэтому конструктор копирования должен вызываться, когда я бросаю объект. Я также знаю, что компилятор может оптимизировать и исключить копирование. У меня есть простая программа, в которой я создаю класс с именем X. Ожидается, что если я сделаю класс не подлежащим копированию, объект не может быть брошен. Но происходит нечто неожиданное. Если я удаляю конструктор копирования, компилятор жалуется на это. Если я прокомментирую удаление конструктора копирования и удаляю конструктор перемещения, компилятор жалуется на удаление конструктора перемещения. код:
class X
{
public:
int code;
X(int code) : code(code) {}
//X(X&) = delete;
//X(X&&) = delete;
};
void func()
{
X x(4);
throw x;
}
int main() { }
Ошибка при удалении конструктора копирования:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&)’
throw x;
^
Ошибка при удалении конструктора перемещения:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&&)’
throw x;
^
Может кто-нибудь объяснить, почему это происходит?
Редактировать: Если я удаляю конструктор копирования и предоставляю реализацию для конструктора перемещения, код работает нормально. Принимая во внимание, что если я удаляю конструктор перемещения и предоставляю реализацию для конструктора копирования, я все равно получаю ту же ошибку. Почему я не могу удалить конструктор перемещения?
код:
class X
{
public:
int code;
X(int code) : code(code) {}
X(X&) = default;
X(X&&) = delete;
};
void func()
{
X x(5);
throw x;
}
int main() { }
ошибка:
main.cpp: In function ‘void func()’:
main.cpp:13:11: error: use of deleted function ‘X::X(X&&)’
throw x;
^