Pull to refresh
0
0
Send message
Вы пишите: «Так же приготовьтесь к тому, что ваши классы исключений c перегруженным методом what() и наследуемые от стандартных, могут не компилироваться если они не помечены noexcept».
Я бы с вами поспорил, если бы вы написали «не должны компилироваться», но вы пишите «могут не компилироваться», поэтому спорить с вами я не буду. Вместо этого уточню некоторые моменты.
1. Динамические спецификации исключений (формы throw) являются запрещенными в С++11. Это означает, что теперь компиляторы могут выдавать предупреждения (но не ошибки) при их использовании. Однако я пока не работал с компиляторами, которые бы это делали (gcc 4.7.2, clang 3.2 молчат даже в режимах максимальной педантичности).
2. Спецификация throw() является совместимой с noexcept и noexcept(true) (пункт 15.4/3 стандарта). А это означает, что приведенный вами пример должен компилироваться. Более того, в вашем примере ограничений еще меньше, поскольку речь идет о переопределении функции (смотрите 15.4/5 стандарта). В принципе эта совместимость также означает, что оператор noexcept должен работать корректно и функциями со спецификацией throw() (пункт 5.3.7/3 стандарта).
На что действительно компиляторы могут выдавать предупреждение в вашем примере, так это на отсутствие квалификатора const у функции what().

Information

Rating
Does not participate
Registered
Activity