说我有这些声明:
using fp_type = void(*)();
using fp2_type = void(*)() noexcept;
和
void func(){}
fp_type fp(func);
演员fp2_type(fp)
格式正确吗?反过来(将noexcept指定的函数指针强制转换为没有noexcept说明符的函数指针)?
答案 0 :(得分:3)
这在C ++ 14及更早版本中是不正确的:
using fp2_type = void(*)() noexcept;
由于N4140 [except.spec] / 2:
异常规范不应出现在typedef声明或 alias-declaration 中。
所以我假设这个问题适用于C ++ 1z,其中异常规范是类型系统的一部分。
可以将“指向
noexcept
函数的指针”类型的prvalue转换为 类型为“指向函数的指针”的prvalue。结果是指向 功能。
因此,void (*)() noexcept
可以(隐式)转换为void (*)()
。
任何标准转换序列(Clause [conv])的反转都没有 包含[[(其他各种情况省略)]函数指针([conv.fctptr])的转换,可以执行 明确使用
static_cast
。
[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)和since C-style casts do a reinterpret_cast
when static_cast
is not possible(为了简单起见,忽略了const_cast
,因为它&#39 ;这里不相关),fp2_type(fp)
是格式良好的reinterpret_cast
。然而,除了将其投射之外,不能使用这种投射的结果。