如何在 C++17 中将抛出函数指针静态转换为 noexcept?

How to static cast throwing function pointer to noexcept in C++17?

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

void (*ptr_to_noexcept)() noexcept = nullptr;
void (*ptr_to_throwing)() = ptr_to_noexcept;  // implicit conversion

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

void (*noexcept_again)() noexcept = static_cast<void(*)() noexcept>(ptr_to_throwing);

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

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

您可能跳过了重要部分:

The inverse of any standard conversion sequence not containing an lvalue-to-rvalue, array-to-pointer, function-to-pointer, null pointer, null member pointer, boolean, or function pointer conversion, can be performed explicitly using static_­cast.

目前,函数指针转换仅包括从 noexcept 到潜在抛出的转换。因为您正在进行函数指针转换的逆运算,所以 static_cast 将不起作用,就像您不能 static_cast 指向数组的指针或此处列出的任何其他转换一样。

所以是的,reinterpret_cast 是合适的,并且也会发出适当的警钟,丢弃 noexcept