По сути, это проблема компоновщика , комитет по стандартам не хотел нарушать ABI. (Если бы это зависело от меня, я бы так и сделал, все, что действительно нужно, - это перекомпиляция библиотеки, у нас уже есть ситуация с включением потоков, и она управляема.)
Подумайте, как это получится. Предположим, что требования были
- каждый деструктор неявно
noexcept(true)
- Возможно, это должно быть строгое требование. Метательные деструкторы всегда ошибка.
- каждый внешний "C" неявно
noexcept(true)
- Снова тот же аргумент: исключения в C-land всегда ошибка.
- каждая другая функция неявно
noexcept(false)
, если не указано иное
- a
noexcept(true)
функция должна обернуть все свои noexcept(false)
вызовы в try{}catch(...){}
- По аналогии, метод const не может вызывать неконстантный метод.
- Этот атрибут должен проявляться как отдельный тип в разрешении перегрузки, совместимости указателя функции и т. Д.
Звучит разумно, верно?
Для реализации этого компоновщик должен различать версии функций noexcept(true)
и noexcept(false)
, так как вы можете перегружать const и const версии функций-членов.
Так, что это значит для именования? Для обеспечения обратной совместимости с существующим объектным кодом нам потребуется, чтобы все существующие имена интерпретировались как noexcept(false)
с дополнительным искажением для noexcept(true)
версий.
Это будет означать, что мы не сможем связываться с существующими деструкторами, если заголовок не будет изменен, чтобы пометить их как noexcept(false)
- это нарушит обратную совместимость,
- это возможно должно быть невозможно, см. Пункт 1.
Я лично говорил об этом с членом комитета по стандартизации, и он говорит, что это было поспешное решение, мотивированное главным образом ограничением операций перемещения в контейнерах (в противном случае вы могли бы получить недостающие элементы после броска, что нарушает основная гарантия). Имейте в виду, это человек, чья философия дизайна заключается в том, что код, не допускающий ошибок, хорош . Сделайте свои собственные выводы.
Как я уже сказал, я бы сломал ABI, предпочитая ломать язык. noexcept
- это лишь незначительное улучшение по старому. Статическая проверка всегда лучше.