5

在 C++14 Sec 15.4;2 中声明,...异常规范不应出现在 typedef 声明或别名声明中。

这意味着禁止以下行为:

typedef void (*fn)(int) noexcept;

但是不应该出现的措辞是否意味着令牌noexcept不能出现在 typedef 声明中的任何地方?

例如,这两者是否也被禁止?

typedef void (*fn1)(void (*)(int) noexcept);
typedef decltype(std::declval<void (*)(int)noexcept>()) fn2;

它们都试图定义一个类型fn1,并fn2能够指向一个函数,该函数接受一个指向函数的指针,该函数接受一个int并且不返回任何内容,同时承诺永远不会抛出异常。

因此,在我的示例中,异常规范不适用于顶级类型fn1。由这些函数可能接收的参数fn2引入。typedef

那么我应该逐字逐句采用 15.4;2 吗,因此我的两个示例都无效?还是仅禁止应用于类型定义并且我的示例是正确的?

4

1 回答 1

6

这就是全部。

引用[except.spec]/p2C++11 和 C++14 的完整措辞:

异常规范应仅出现在函数类型的函数声明符、指向函数类型的指针、对函数类型的引用或指向作为声明或定义的顶级类型的成员函数类型的指针上,或出现在此类类型上在函数声明器中作为参数或返回类型出现。异常规范不应出现在 typedef 声明或alias-declaration中。

也许它并不完全清楚,但我认为它已经足够了:您可以在函数声明中使用异常规范,包括在函数声明的参数或返回类型中......但不能在别名声明中。

这个措辞在 C++17 中已被完全删除;noexcept现在是类型系统的一部分

于 2019-01-29T17:34:27.190 回答