说我有这些声明:
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 [spec.spec] / 2:
一个异常规范,不得出现在typedef声明或别名声明。
因此,我将假设问题出在C ++ 1z,其中异常规范是类型系统的一部分。
noexcept
可以将“函数指针”的prvalue转换为“函数指针”的prvalue。结果是指向该函数的指针。
因此,void (*)() noexcept
可以(隐式)转换为void (*)()
。
可以使用显式执行不包含[[(省略其他各种情况)]]函数指针([conv.fctptr])转换的任何标准转换序列(Clause [conv])的逆运算
static_cast
。
[expr.static.cast]中的任何其他内容都不允许转换void (*)()
为void (*)() noexcept
任何一个,因此这不是可以由进行的转换static_cast
。
函数指针可以显式转换为其他类型的函数指针。通过指向与函数定义中使用的类型不同的函数类型([dcl.fct])的指针调用函数的效果是不确定的。除了将“ pointer to
T1
”类型的prvalue转换为“ pointer to ”类型T2
(其中T1
和T2
是函数类型)并返回其原始类型会产生原始指针值外,这种指针转换的结果未指定。[注意:有关指针转换的更多详细信息,另请参见[conv.ptr]。—尾注]
因此reinterpret_cast
可以执行此转换。
因为fp2_type(fp)
等效于C风格的强制转换(fp2_type) fp
([expr.type.conv] / 1),并且由于C风格的强制转换无法实现reinterpret_cast
whenstatic_cast
(忽略const_cast
简单性,因为此处不相关),fp2_type(fp)
所以格式正确reinterpret_cast
。但是,这种转换的结果只能用于将其回退。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句