为什么函数类型的“noexcept”不是说明符的一部分?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (63)

我不明白为什么?我不认为兼容性应该是一个问题,因为没有指定符的函数实际上已经隐式定义为false。

这在使用模板时非常有用,因为现在比较函数类型和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

因此,现在实现全功能匹配应该通过执行type和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
提问于
用户回答回答于

从C ++ 17开始,说明noexcept符是函数类型的一部分。

参考

noexcept-specification是函数类型的一部分,可以作为任何函数声明符的一部分出现。(自C ++ 17以来)

用户回答回答于

C/C++ 03兼容性

C ++最重要的基本思想之一是向后兼容C语言和较早的C ++版本。它在大多数情况下都可以使用。noexcept,在C ++ 03和C,会导致与函数指针等问题。

在C ++ 17中noexcept实际上成为了类型系统的一部分,所以你不能这样:

void (*p)();
void (**pp)() noexcept = &p; //error here

扫码关注云+社区

领取腾讯云代金券