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#7说static_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风格的投我唯一的选择吗?
您可能已经跳过了重要的部分:
可以使用static_cast显式执行不包含左值到右值,数组到指针,函数到指针,空指针,空成员指针,布尔值或函数指针转换的任何标准转换序列的逆运算。
当前,函数指针转换仅包括从noexcept到潜在抛出的转换。因为您执行的是函数指针转换的逆操作,所以static_cast将无法正常工作,就像您无法static_cast指向数组的指针或此处列出的任何其他转换一样。
因此,是的,reinterpret_cast这将是适当的,并且还会引发应随丢弃物一起发出的适当的警钟noexcept。