函数类型定义中的noexcept说明符

17

noexcept修饰符是否接受在函数typedef中使用?

例如:

 typedef void (*fptr)()  noexcept;

从直觉上来看,noexcept说明符似乎很有意义,因为它们可以在调用方处允许一些优化。

我从gcc 4.6.1得到了一个不同的答案。

 typedef void (*fptr)()  noexcept;

结果为:

错误:使用异常说明声明了 ‘fptr’

但是:

template<void (*FPtr)()  noexcept>
struct A{};

可以无警告地编译。


1
在C++17及以后的版本中,异常规格(又称为noexcept)不仅可以用于(成员)函数类型,还可以用于函数指针和引用类型。 - Bolpat
1个回答

10

clang 给出:

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

在C++11标准的15.4 [except.spec]/p2中有这样的规定:

... 在typedef声明或别名声明中不得出现异常说明。


请注意,保留了HTML标记。

谢谢。这可能会使在模板参数中接受noexcept子句成为gcc中的一个错误? - mirk
2
我不这么认为。[temp.param]/p4说非类型参数可以是指向函数的指针,我没有看到该领域中提到任何异常规范。而[except.spec]/p2明确表示异常规范可以出现在指向函数的指针上。 - Howard Hinnant
再次感谢。我对这个结果有点困惑,但是争论标准也没有意义。 - mirk
1
@DirkM:也许是因为两者都是异常规范? ;) - Xeo
2
请注意,仍然可以为noexcept函数指针声明typedef:void dummy() noexcept; typedef decltype(dummy)* f_ptr_t;。可以在此处找到可工作的代码。 - Max Truxa
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接