完全禁止 ˋtypedefˋ 中的异常规范或仅在顶层指定

Exception specification in ˋtypedefˋ completely forbidden or only at toplevel?

本文关键字:禁止 typedef 异常      更新时间:2023-10-16

在 C++14 秒 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;

它们都试图定义一个类型fn1fn2能够指向一个函数,该函数将指针指向一个接受int的函数,同时承诺永远不会引发异常。

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

那么我应该逐字记录 15.4;2 因此我的两个示例都是无效的吗?还是只禁止应用于类型定义,而我的示例是正确的?

这是整个事情。

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

异常规范应仅出现在函数类型的函数声明符、指向函数类型的指针

、对函数类型的引用或指向作为声明或定义的顶级类型的成员函数类型的指针上,或者出现在函数声明符中显示为参数或返回类型的此类类型上。异常规范不得出现在 typedef 声明或别名声明中。

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

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