gpt4 book ai didi

c++ - constexpr 表达式必须由 C++ 中的 lambda 捕获吗?

转载 作者:可可西里 更新时间:2023-11-01 15:21:22 26 4
gpt4 key购买 nike

这是一段在 MSVC 2015 中无法编译的代码(忽略未初始化的值访问):

#include <array>
int main() {
constexpr int x = 5;
auto func = []() {
std::array<int, x> arr;
return arr[0];
};
func();
}

它提示说:

'x' cannot be implicitly captured because no default capture mode has been specified

但是 x 是一个 constexpr! x 在编译时已知为 5。为什么 MSVC 对此大惊小怪? (还有另一个 MSVC 错误吗?)GCC 会很乐意编译它。

最佳答案

代码格式正确。 [expr.prim.lambda] 的规则是:

If a lambda-expression or an instantiation of the function call operator template of a generic lambda odr-uses (3.2) this or a variable with automatic storage duration from its reaching scope, that entity shall be captured by the lambda-expression.

任何被 odr 使用的变量都必须被捕获。 x 是否在 lambda 表达式中使用了 odr?不它不是。 [basic.def.odr] 的规则是:

A variable x whose name appears as a potentially-evaluated expression ex is odr-used by ex unless applying the lvalue-to-rvalue conversion (4.1) to x yields a constant expression (5.20) that does not invoke any non-trivial functions and, if x is an object, ex is an element of the set of potential results of an expression e, where either the lvalue-to-rvalue conversion (4.1) is applied to e, or e is a discarded-value expression (Clause 5).

x 仅在我们应用左值到右值转换并以常量表达式结束的上下文中使用,因此它不是 odr-used,因此我们不需要捕获它。程序没问题。这与标准中的这个示例格式正确的原因相同:

void f(int, const int (&)[2] = {}) { }   // #1
void f(const int&, const int (&)[1]) { } // #2

void test() {
const int x = 17;
auto g = [](auto a) {
f(x); // OK: calls #1, does not capture x
};
// ...
}

关于c++ - constexpr 表达式必须由 C++ 中的 lambda 捕获吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42610429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com