конструктор перемещения для std::exception
От: B0FEE664  
Дата: 26.09.18 09:37
Оценка:
Почему у 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&&) не будет создан вовсе?
И каждый день — без права на ошибку...
Re: конструктор перемещения для std::exception
От: rg45 СССР  
Дата: 26.09.18 10:10
Оценка:
Здравствуйте, 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&&) не будет создан вовсе?


Не будет создан вовсе, если перемещающий конструктор в базовом классе явно объявлен удаленным. В остальных случаях подхватится либо конструктор перемещения базового класса (если доступен), либо копирующий.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.09.2018 10:13 rg45 . Предыдущая версия . Еще …
Отредактировано 26.09.2018 10:12 rg45 . Предыдущая версия .
Re[2]: конструктор перемещения для std::exception
От: B0FEE664  
Дата: 26.09.18 12:01
Оценка:
  Скрытый текст
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;
  };
}
И каждый день — без права на ошибку...
Re[3]: конструктор перемещения для std::exception
От: rg45 СССР  
Дата: 26.09.18 12:06
Оценка: 10 (2)
Здравствуйте, 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), а в производном классе оставить объявление перемещающего конструктора по умолчанию, то код для него сгенерен не будет и в тех местах, в которых ожидается перемещение, возникнет ощибка компиляции.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.09.2018 12:10 rg45 . Предыдущая версия . Еще …
Отредактировано 26.09.2018 12:09 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.