'typedef'中的异常规范是完全被禁止的还是仅仅是在顶级?

chi*_*chi 5 c++ typedef exception-specification c++14

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

这意味着禁止以下内容:

typedef void (*fn)(int) noexcept;
Run Code Online (Sandbox Code Playgroud)

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

比如这些都是禁止的吗?

typedef void (*fn1)(void (*)(int) noexcept);
typedef decltype(std::declval<void (*)(int)noexcept>()) fn2;
Run Code Online (Sandbox Code Playgroud)

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

因此在我的示例中,异常规范不适用于顶层类型fn1resp.fn2typedef这些函数可能接收的参数引入.

那么我应该逐字取15.4; 2,因此我的两个例子都无效?或者只是应用于禁止的类型定义,我的例子是正确的?

Lig*_*ica 6

这是整个事情.

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

一个异常规范应仅在一个函数声明为函数类型出现,函数指针类型,参照功能类型或成员函数指针类型,它是一个声明或定义,的顶级类型或上这样一种类型在函数声明符中作为参数或返回类型出现.一个异常规范,不得出现在typedef声明或别名声明.

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

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

  • FWIW,该段落被[P0012R1]删除(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0012r1.html) (2认同)