我不明白为什么?我认为兼容性不应该是个问题,因为没有指定的函数实际上会隐式定义为false。如果是关于名称修饰的问题 - 我们可以假设旧的(已存在的)将意味着noexcept(false),并为noexcept(true)添加另一个新的修饰符。
在使用模板时,这将非常有用,因为现在需要分别比较函数类型和noexcept修饰符。我的基本意思是这样的:
但另一方面,如果我们通过指针或引用进行函数赋值,那么 noexcept 限定符将被视为类型的一部分进行检查。
想象一下,如果函数有参数的话:
在使用模板时,这将非常有用,因为现在需要分别比较函数类型和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
所以目前实现完整的功能匹配应该通过执行类型和noexcept检查来完成,这有点复杂:
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