繁体   English   中英

如何在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风格是我的唯一选择吗?

您可能跳过了重要部分:

可以使用static_cast显式执行任何不包含左值到右值,数组到指针,函数到指针,空指针,空成员指针,布尔值或函数指针转换的标准转换序列的反转。

目前,函数指针转换仅包括从noexcept到潜在抛出的转换。 因为你正在执行函数指针转换的反转,所以static_cast将不起作用,就像你不能static_cast一个指向数组的指针,或者那里列出的任何其他转换一样。

所以,是的, reinterpret_cast是合适的,并且还会提出适当的警钟,应该放弃noexcept

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM