[英]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,其中异常规范是类型系统的一部分。
可以将“指向
noexcept
函数的指针”类型的prvalue转换为“指向函数的指针”类型的prvalue。 结果是指向函数的指针。
因此, void (*)() noexcept
可以(隐式)转换为void (*)()
。
可以使用
static_cast
显式执行任何标准转换序列(Clause [conv])的反转,不包含[(各种其他情况省略)]函数指针([conv.fctptr])转换。
[expr.static.cast]中的任何其他内容都不允许将void (*)()
转换为void (*)() noexcept
,因此这不是static_cast
可以执行的转换。
函数指针可以显式转换为不同类型的函数指针。 通过指向函数类型([dcl.fct])的指针调用函数的效果是未定义的,该函数与函数定义中使用的类型不同。 除了将“指向
T1
指针”的prvalue转换为“指向T2
指针”类型(其中T1
和T2
是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定。 [注意:有关指针转换的更多详细信息,另请参阅[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.