Ответ 1
Извините, нет. Единственные неявные спецификации исключений -
- О деструкторах.
- На других неявно объявленных или явно дефолтных специальных функциях-членах: конструкторы по умолчанию, конструкторы копирования и перемещения, а также копирование и перемещение назначения, если они не объявлены в определении класса, или объявлены с
= default;
, - О функциях освобождения:
operator delete
operator delete[]
.
[Обратите внимание, что для функций дезактивации неявная спецификация исключений всегда выглядит как noexcept(true)
. Для специальных функций-членов, которые неявно объявлены или явно дефолтны, неявная спецификация исключений может быть либо noexcept(true)
либо noexcept(false)
, как определено из спецификаций исключения соответствующих специальных функций-членов любых базовых классов и членов тип класса.]
Таким образом, с объявлением примера noexcept(static_cast<const char*>(std::declval<const MyString>()))
должно быть false
. Идите дальше и напишите noexcept
где это может иметь значение.
Конечно, как вы отметили, оптимизация компилятора по-прежнему позволяет заметить, что встроенная функция не может генерировать исключения и упрощать обработку исключений в вызывающем.