mut*_*oid 6 c++ inline noexcept c++20 consteval
我正在处理一些constexpr使用函数的代码,我目前consteval尽可能将其重构为。
inline constexpr auto example() noexcept { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
据我了解,inline上面的关键字在constexpr函数中已经是多余的了。
据我所知,noexcept关键字对于consteval函数来说是多余的,因为据我所知,它consteval必须在编译时进行评估,因此意味着 noexcept。这是真的还是我目前不考虑的东西(比如 constexpr exceptions)?
consteval auto example() { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
inline是多余的,因为:[dcl.constexpr]/1:
用
constexprorconsteval说明符声明的函数或静态数据成员隐式是内联函数或变量 ([dcl.inline])。
noexcept更有趣一些。这是事实,试图抛出一个异常(无论是通过throw,dynamic_cast或typeid)不固定在评估时间(允许[expr.const] /5.24)。由于一个consteval函数只在恒定的评估时间内被评估,所以noexcept它的好处很小——异常肯定永远不会超出这个范围。而且,您甚至不能让指向这些函数的函数指针泄漏到运行时。我真的没有想到与这相关的机制。
但是,也许在未来的某个时候,我们是否可以在不断评估期间允许出现异常?如果我们去那里,了解noexcept那个世界中的 -ness会变得重要吗?从常量评估上下文中泄漏的异常可能意味着编译错误,所以您是否有基于noexceptconsteval 函数的 -ness做出不同选择的算法?
也就是说,我会跳过noexcept. 现在肯定没有好处,将来也可能没有好处。如果我最终错了,那么……我很抱歉。
虽然真的,正如 TC 指出的那样,事情并没有那么简单:
consteval int current() { return 1; }
void f(int, int = current()) noexcept;
Run Code Online (Sandbox Code Playgroud)
什么noexcept(f(1))?正如所写,它是false. 这很奇怪,因为这个表达式f(1)肯定不会抛出。所以也许你应该写noexcept. 虽然从那以后它绝对不能抛出,但也许语言应该默认生成consteval函数noexcept。尽管如果我们这样做,并最终在不断的评估时间内添加异常……现在我们又回到撒谎了,因为这是我们无法挽回的事情。