Почему у std::exception нет move конструктора?
Задача: поймать и конвертировать велосипедное исключение в исключение отнаследованное от std::exception, а результат бросить дальше.
Соответственно, если я напишу:
class NewException : public std::exception
{
public:
NewException()noexcept{}
NewException(const NewException&) noexcept = default;
NewException(NewException&& ) noexcept = default;
virtual ~NewException() {}
virtual const char* what() const noexcept;
//...
};
то сможет ли компилятор создать код для NewException(NewException&&) если у базового класса (std::exception) нет подходящего конструктора? Или же NewException(NewException&&) не будет создан вовсе?
Здравствуйте, B0FEE664, Вы писали:
BFE>Почему у std::exception нет move конструктора?
BFE>Задача: поймать и конвертировать велосипедное исключение в исключение отнаследованное от std::exception, а результат бросить дальше.
BFE>Соответственно, если я напишу:
BFE>BFE>class NewException : public std::exception
BFE>{
BFE>public:
BFE> NewException()noexcept{}
BFE> NewException(const NewException&) noexcept = default;
BFE> NewException(NewException&& ) noexcept = default;
BFE> virtual ~NewException() {}
BFE> virtual const char* what() const noexcept;
BFE>//...
BFE>};
BFE>
BFE>то сможет ли компилятор создать код для NewException(NewException&&) если у базового класса (std::exception) нет подходящего конструктора? Или же NewException(NewException&&) не будет создан вовсе?
Не будет создан вовсе, если перемещающий конструктор в базовом классе явно объявлен удаленным. В остальных случаях подхватится либо конструктор перемещения базового класса (если доступен), либо копирующий.
| Скрытый текст |
| BFE>>BFE>>class NewException : public std::exception
BFE>>{
BFE>>public:
BFE>> NewException()noexcept{}
BFE>> NewException(const NewException&) noexcept = default;
BFE>> NewException(NewException&& ) noexcept = default;
BFE>> virtual ~NewException() {}
BFE>> virtual const char* what() const noexcept;
BFE>>//...
BFE>>};
BFE>>
BFE>>то сможет ли компилятор создать код для NewException(NewException&&) если у базового класса (std::exception) нет подходящего конструктора? Или же NewException(NewException&&) не будет создан вовсе? |
| |
R>Не будет создан вовсе, если перемещающий конструктор в базовом классе явно объявлен удаленным. В остальных случаях подхватится либо конструктор перемещения базового класса (если доступен), либо копирующий.
Перемещающий конструктор удалён, но не явно:
namespace std {
class exception {
public:
exception() noexcept;
exception(const exception&) noexcept;
exception& operator=(const exception&) noexcept;
virtual ~ exception();
virtual const char* what() const noexcept;
};
}
Здравствуйте, B0FEE664, Вы писали:
BFE>Перемещающий конструктор удалён, но не явно:
BFE>BFE>namespace std {
BFE> class exception {
BFE> public:
BFE> exception() noexcept;
BFE> exception(const exception&) noexcept;
BFE> exception& operator=(const exception&) noexcept;
BFE> virtual ~ exception();
BFE> virtual const char* what() const noexcept;
BFE> };
BFE>}
BFE>
Э нет, это не удален, это скрыт (hidden). В этом случае компилятор сгенерит перемещающий конструктор в производном классе и реализует его через копирующий конструктор базового.
А вот если удалить конструктор перемещения базового класса явно (delete), а в производном классе оставить объявление перемещающего конструктора по умолчанию, то код для него сгенерен не будет и в тех местах, в которых ожидается перемещение, возникнет ощибка компиляции.