inline
是多余的,因为:[dcl.constexpr]/1:
constexpr
使用or说明符声明的函数或静态数据成员consteval
隐含地是内联函数或变量 ([dcl.inline])。
noexcept
更有趣一些。确实,在恒定评估时间内( [expr.const]/5.24 )不允许尝试抛出异常(无论是 via throw
、dynamic_cast
还是)。而且由于一个函数只在恒定的评估时间内进行评估,它的好处很小——一个异常肯定永远不会逃脱这个范围。而且,您甚至不能让指向这些函数的函数指针泄漏到运行时。真的没有我能想到的与之相关的机制。typeid
consteval
noexcept
但是,也许在未来的某个时候,我们是否可以在持续评估期间出现例外情况?如果我们去那里,了解noexcept
那个世界的-ness会变得很重要吗?从常量评估上下文中泄漏的异常可能意味着编译错误,那么您是否有算法根据noexcept
consteval 函数的 -ness 做出不同的选择?
也就是说,我会跳过noexcept
. 它现在肯定没有好处,将来甚至可能没有好处。如果我最终错了,那么......我很抱歉。
尽管正如 TC 所指出的那样,这确实不是那么简单:
consteval int current() { return 1; }
void f(int, int = current()) noexcept;
是什么noexcept(f(1))
?正如所写,它是false
. 这很奇怪,因为这个表达式f(1)
肯定不会抛出。所以也许你应该写noexcept
。虽然既然再一次肯定不能抛出,也许语言应该默认生成consteval
函数noexcept
。虽然如果我们这样做,并最终在不断的评估时间内添加异常......现在我们又回到了撒谎,因为这是我们无法收回的东西。