默认情况下 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.
这引出了两个问题:
- 为什么我们需要
constexpr
说明符?看起来 lambda 调用运算符是否为 constexpr
仅取决于它 "satisfy the requirements of a constexpr
function" 的事实,而不取决于 constexpr
说明符的存在。
- 如果默认使用
constexpr
lambda 是可以接受的,为什么不建议将它也用于其他类型的函数 - 例如全局函数?如果编译器开始将所有满足需求的函数视为 constexpr
? 会产生什么影响
constexpr
限定符使 lambda 违反 constexpr
函数的要求成为 编译错误 。当您明确 需要 lambda 为 constexpr
时使用它,这样您就不会不小心使它不是 constexpr
.
Asked and answered.
根据 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) isconstexpr
if it would satisfy the requirements of aconstexpr
function.
这引出了两个问题:
- 为什么我们需要
constexpr
说明符?看起来 lambda 调用运算符是否为constexpr
仅取决于它 "satisfy the requirements of aconstexpr
function" 的事实,而不取决于constexpr
说明符的存在。 - 如果默认使用
constexpr
lambda 是可以接受的,为什么不建议将它也用于其他类型的函数 - 例如全局函数?如果编译器开始将所有满足需求的函数视为constexpr
? 会产生什么影响
constexpr
限定符使 lambda 违反constexpr
函数的要求成为 编译错误 。当您明确 需要 lambda 为constexpr
时使用它,这样您就不会不小心使它不是constexpr
.Asked and answered.