繁体   English   中英

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

[英]Casting a function pointer into a noexcept specified function pointer

说我有这些声明:

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

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

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

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

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

[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 ),并且由于C风格的强制转换在无法执行static_cast时执行reinterpret_cast (为简单起见忽略const_cast ,as as这里没有关系), fp2_type(fp)是一个结构良好的reinterpret_cast 然而,除了将其投回之外,不能使用这种投射的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM