Я не понимаю, почему? Я не думаю, что совместимость должна быть проблемой, поскольку функции, объявленные без спецификатора, фактически неявно определяют значение false. Если это связано с именем mangling - можем ли мы предположить, что старый (существующий) будет означать noexcept (false) и добавить еще один новый символ в mangling для noexcept (true).
Это будет полезно при работе с шаблонами, поскольку теперь сравнение типа функции и спецификатора noexcept должно выполняться отдельно. В основном я имею в виду следующее:
int func() noexcept(true), func_1() noexcept(false);
decltype(func) == decltype(func_1); //this now equals true
Но, с другой стороны, если бы у нас было назначение функции с помощью указателя или ссылки, то - спецификатор noexcept проверяется, как если бы он был частью типа:
int (&refFunc)() noexcept(true) = func_1; //target exception specification is not superset of source
int (&refFunc)() noexcept(true) = func; //ok
Итак, теперь реализация полного соответствия функций должна выполняться как выполняющим типом, так и безэксплуатационной проверкой, которая является сложной:
decltype(func) == decltype(func_1) && noexcept(func()) == noexcept(func_1()); //this now equals false
Представьте, если функции получили параметры:
int func(int, double) noexcept(true), func_1(int, double) noexcept(false);
decltype(func) == decltype(func_1) && noexcept(func(int{}, double{})) == noexcept(func_1(int{}, double{})); //this now equals false