【问题标题】:Exception specification in ˋtypedefˋ completely forbidden or only at toplevel?ˋtypedefˋ 中的异常规范完全禁止还是仅在顶层?
【发布时间】:2019-01-29 17:26:41
【问题描述】:

在 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;

它们都试图定义一个类型 fn1fn2 能够指向一个函数,该函数接受一个指向一个函数的指针,该函数采用 int 并且什么也不返回,同时承诺永远不会抛出异常。

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

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

【问题讨论】:

  • 您指的是 C++14,但标记为 C++11。为了准确起见,您想要哪个?
  • 我指的是 C++14。很抱歉用 C++11 标记它,它从我的手指中滑落。感谢您提及!

标签: c++ c++14 typedef exception-specification


【解决方案1】:

这就是全部。

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

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

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

这个措辞在 C++17 中已经被完全删除; noexcept is part of the type system now.

【讨论】:

  • FWIW,该段落已被P0012R1删除
  • 感谢两位的帮助!
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2014-08-18
  • 2018-11-05
  • 2013-10-15
  • 2021-08-20
  • 2020-03-07
相关资源
最近更新 更多