函数typedef中的noexcept说明符

mir*_*irk 15 c++ function-pointers noexcept c++11

函数typedef中是否接受noexcept说明符?

如:

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

直觉上,noexcept说明符似乎有意义,因为它们允许在调用者方面进行一些优化.

我从gcc 4.6.1得到了一个复杂的答案.

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

导致:错误:使用异常规范声明'fptr'

但:

template<void (*FPtr)()  noexcept>
struct A{};
Run Code Online (Sandbox Code Playgroud)

编译时没有警告.

How*_*ant 8

clang给出:

test.cpp:1:25: error: exception specifications are not allowed in typedefs
typedef void (*fptr)()  noexcept;
                        ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

这在15.4 [except.spec]/p2中的C++ 11标准中备份:

... 异常规范不应出现在typedef声明或alias-declaration中.

  • 我不这么认为.[temp.param]/p4表示非类型参数可以是指向函数的指针,我在该区域中没有看到任何异常规范.[except.spec]/p2特别指出异常规范可以出现在指向函数的指针上. (2认同)
  • 请注意,仍然可以为 noexcept 函数指针声明 typedef:`void dummy() noexcept; typedef decltype(dummy)* f_ptr_t;`. 可以在 [此处](https://ideone.com/Z0gMd9) 找到工作代码。 (2认同)