如何在 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
。
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
。