默认情况下 Constexpr lambda?

Constexpr lambda by default?

根据 n4487 和其他 c++17 参考资料,将有新的 lambda 函数说明符 - constexpr ,如果存在 "explicitly specifies that the function call operator is a constexpr function.".我理解 lambda 中常量表达式的动机。对我来说有趣的是提案的第 4 点,其中指出:

4) If the constexpr specifier is omitted within the lambda-declarator, the function call operator (or template) is constexpr if it would satisfy the requirements of a constexpr function.

这引出了两个问题:

  1. 为什么我们需要 constexpr 说明符?看起来 lambda 调用运算符是否为 constexpr 仅取决于它 "satisfy the requirements of a constexpr function" 的事实,而不取决于 constexpr 说明符的存在。
  2. 如果默认使用 constexpr lambda 是可以接受的,为什么不建议将它也用于其他类型的函数 - 例如全局函数?如果编译器开始将所有满足需求的函数视为 constexpr?
  3. 会产生什么影响
  1. constexpr 限定符使 lambda 违反 constexpr 函数的要求成为 编译错误 。当您明确 需要 lambda 为 constexpr 时使用它,这样您就不会不小心使它不是 constexpr.

  2. Asked and answered.