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语言风格的转换是我唯一的选择吗?
static_cast
的困惑,而是直接问“我该如何进行类型转换?有哪些风险?”那么它会更有用。 - Davis Herringconst
的const_cast
或从基类到派生类的转换更危险,其中我知道我的基础引用确实是指向派生对象的。我只关心这个noexcept
转换还要承担所有reinterpret_cast
的风险。 - Filipp