将函数指针强制转换为noexcept指定的函数指针

时间:2016-02-22 10:25:50

标签: c++ function-pointers noexcept

说我有这些声明:

using fp_type = void(*)();
using fp2_type = void(*)() noexcept;

void func(){}
fp_type fp(func);

演员fp2_type(fp)格式正确吗?反过来(将noexcept指定的函数指针强制转换为没有noexcept说明符的函数指针)?

1 个答案:

答案 0 :(得分:3)

这在C ++ 14及更早版本中是不正确的:

using fp2_type = void(*)() noexcept;

由于N4140 [except.spec] / 2:

  

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

所以我假设这个问题适用于C ++ 1z,其中异常规范是类型系统的一部分。

[conv.fctptr]/1

  

可以将“指向noexcept函数的指针”类型的prvalue转换为   类型为“指向函数的指针”的prvalue。结果是指向   功能。

因此,void (*)() noexcept可以(隐式)转换为void (*)()

[expr.static.cast]/7

  

任何标准转换序列(Clause [conv])的反转都没有   包含[[(其他各种情况省略)]函数指针([conv.fctptr])的转换,可以执行   明确使用static_cast

[expr.static.cast]中的任何其他内容都不允许将void (*)()转换为void (*)() noexcept,因此这不是static_cast可以执行的转换。

[expr.reinterpret.cast]/6

  

函数指针可以显式转换为函数指针   不同类型的。通过一个函数调用函数的效果   指向与函数类型不同的函数类型([dcl.fct])的指针   函数定义中使用的类型是未定义的。除了那个   将“指向T1的指针”的prvalue转换为“指向的指针”   T2“(其中T1T2是函数类型)并返回其原始类型   产生原始指针值,这种指针的结果   转换未指定。 [注意:另请参阅[conv.ptr]了解更多信息   指针转换的详细信息。 - 结束说明]

因此reinterpret_cast可以执行此转换。

由于fp2_type(fp)等同于C风格的演员(fp2_type) fp[expr.type.conv]/1)和since C-style casts do a reinterpret_cast when static_cast is not possible(为了简单起见,忽略了const_cast,因为它&#39 ;这里不相关),fp2_type(fp)是格式良好的reinterpret_cast。然而,除了将其投射之外,不能使用这种投射的结果。