在放宽constexpr的规则后,似乎这些功能可以在任何地方使用。它们也可以在常量(constexpr)和局部(可变)变量上调用。所以对我来说,它似乎只是编译器的一个提示(如内联)。我只是继续在任何地方写它并在编译器抱怨时删除它。因此,如果可以在编译时评估函数,编译器似乎知道所有内容。为什么它不是默认行为,为什么我必须将任何东西标记为constexpr?
答案 0 :(得分:17)
constexpr
是一个接口保证。这意味着您可以在常量表达式中使用该函数。
一旦人们可以在常量表达中使用它们,他们就会。但是,如果你不是故意以这种方式使用你的功能呢?如果您之前有一个简单的实现恰好是constexpr可能会怎么样,但在以后的版本中您需要更改它(例如,因为您现在需要添加日志输出)?
如果删除constexpr标记,则常量表达式中的用法会停止编译,如果之前有效,则函数的用户将会感到不安。最好不要首先使用constexpr函数,以便以后更自由地更改它。
但是如果编译器自动使你的函数constexpr,你没有那个选择。
答案 1 :(得分:2)
正如here指出的那样,使用函数模板特化是不同的,使用constexpr
说明符定义或不在(例如) SFINAE 上下文中使用:
添加constexpr会导致函数模板在未评估的上下文中实例化,否则不会。
因此,有时将所有函数隐式定义为constexpr
将是一种不受欢迎的行为。