Вопрос про noexcept и правила автоматической генерации функций-членов - конструкторов, операторов присвоения и пр
Скажите, пожалуйста, как спецификатор noexcept влияет на правила автоматической генерации конструкторов/операторов/деструкторов/методов?
- Например, если я определяю один единственный пользовательский конструктор со спецификатором
noexcept, значит ли это, что компилятор гарантированно не будет генерировать другие конструкторы с той же сигнатурой, но без спецификатораnoexcept? - Например, если я перегружаю копирующий оператор присвоения
T& operator=(const T&) noexcept, значит ли, что компилятор гарантированно не будет генерировать другие копирующие операторы присвоения с той же сигнатурой, но без спецификатораnoexcept? - Что насчет перемещающих конструкторов/операторов присвоения? Может ли компилятор несмотря на пользовательские перемещающие конструкторы/операторы сгенерировать (и неожиданно вызвать) перемещающие конструкторы/операторы с той же сигнатурой, но без спецификатора
noexcept? Это самый важный вопрос, на который я бы хотел получить ответ, потому что перемещение обычно не должно генерировать исключений, так как на перемещении без исключений строятся идиомы согласованного обновления данных (реализация строгой гарантии исключений через идиомуcopy-update-swap).