如何在C ++ 17中将强制转换的函数指针强制转换为noexcept?

Fil*_*ipp 13 c++ function-pointers static-cast noexcept c++17

C ++ 17 noexcept是函数类型的一部分。它还允许从noexcept函数指针到潜在地抛出函数指针的隐式转换。

void (*ptr_to_noexcept)() noexcept = nullptr;
void (*ptr_to_throwing)() = ptr_to_noexcept;  // implicit conversion
Run Code Online (Sandbox Code Playgroud)

http://eel.is/c++draft/expr.static.cast#7static_cast可以执行这种转换的逆过程。

void (*noexcept_again)() noexcept = static_cast<void(*)() noexcept>(ptr_to_throwing);
Run Code Online (Sandbox Code Playgroud)

不幸的是,GCC和clang都告诉我否则:https : //godbolt.org/z/TgrL7q

正确的方法是什么?是reinterpret_cast和C风格的投我唯一的选择吗?

chr*_*ris 6

您可能已经跳过了重要的部分:

可以使用static_cast显式执行不包含左值到右值,数组到指针,函数到指针,空指针,空成员指针,布尔值或函数指针转换的任何标准转换序列的逆运算。

当前,函数指针转换仅包括从noexcept到潜在抛出的转换。因为您执行的是函数指针转换的逆操作,所以static_cast将无法正常工作,就像您无法static_cast指向数组的指针或此处列出的任何其他转换一样。

因此,是的,reinterpret_cast这将是适当的,并且还会引发应随丢弃物一起发出的适当的警钟noexcept

  • @Filipp,我除了猜测之外什么都没有,但是 `static_cast` 往往会远离更不安全的东西,并且通常在您需要一个不同类型的值时出现。我想象“noexcept”在这方面与“const”类似,丢弃它会破坏之前做出的承诺,这可能会给读者带来严重的后果。大多数其他逆矩阵对于 C++ 来说没有太大意义。让我感到困惑的是布尔转换。从 bool 到函数指针没有多大意义,但编译器允许在 `static_cast` 中将 bool 转换为浮点类型。 (3认同)