【发布时间】:2019-08-22 01:15:16
【问题描述】:
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 风格转换是我唯一的选择吗?
【问题讨论】:
-
"reinterpret_cast 和 C 风格转换" 我的经验中。
-
如果这个问题抛开对
static_cast的困惑并简单地问“我怎样才能投射这个?有什么危险?”。 -
我故意不问危险是什么。这应该不会比
const_cast更危险,其中原始对象被声明为非const或派生转换的基础,我知道我的基础引用实际上是指派生对象。我只担心这个noexcept演员也需要reinterpret_cast的所有风险。
标签: c++ c++17 function-pointers static-cast noexcept