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 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 https://godbolt.org/z/TgrL7q
这样做的正确方法是什么?是reinterpret_cast
而C风格铸成我唯一的选择?
您可能跳过了重要的部分:
任何标准转换序列的逆不包含左值到右值、数组到指针、函数到指针、空指针、空成员指针、布尔值、或函数指针转换,可以使用 static_cast 显式执行。
目前,函数指针转换仅包括从noexcept
到潜在的投掷。因为您正在执行函数指针转换的逆操作,static_cast
不会起作用,就像你做不到一样static_cast
指向数组的指针,或其中列出的任何其他转换。
So yes, reinterpret_cast
是适当的,并且也会引起适当的警钟,应伴随丢弃noexcept
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)