两边都带有省略号的 Lambda 包捕获 - 这是什么意思?
Lambda pack capture with ellipsis on both sides - what is the meaning?
P0780 ("Allow pack expansion in lambda init-capture"),批准用于 C++20,允许通过在作为 lambda 捕获的一部分的包扩展之前放置省略号 (...
) 来生成一组闭包数据成员。
这很有用 - 例如 - 当通过移动捕获包时:
template <typename... Ts>
void foo(Ts... xs)
{
bar([...xs = std::move(xs)]{ /* ... */ });
}
在尝试这个功能时,我想到了这个神秘的结构:
template <typename... Ts>
void foo(Ts... xs)
{
[...xs...]{}();
}
int main()
{
foo(0, 1, 2);
}
g++ (trunk) 编译它,但老实说我很难理解它的含义。这是什么意思? generate 闭包的数据成员是什么?
它应该是错误的。归档 89686 (... and already fixed!) The grammar in [expr.prim.lambda.capture] 是:
capture:
simple-capture ...
opt
...
opt init-capture
您可以简单捕获(即xs...
)或 你可以有一个 init-capture (这将是 ...xs=xs
,一个 init-capture 需要有一个 初始化器)。你不能同时拥有两者。
P0780 ("Allow pack expansion in lambda init-capture"),批准用于 C++20,允许通过在作为 lambda 捕获的一部分的包扩展之前放置省略号 (...
) 来生成一组闭包数据成员。
这很有用 - 例如 - 当通过移动捕获包时:
template <typename... Ts>
void foo(Ts... xs)
{
bar([...xs = std::move(xs)]{ /* ... */ });
}
在尝试这个功能时,我想到了这个神秘的结构:
template <typename... Ts>
void foo(Ts... xs)
{
[...xs...]{}();
}
int main()
{
foo(0, 1, 2);
}
g++ (trunk) 编译它,但老实说我很难理解它的含义。这是什么意思? generate 闭包的数据成员是什么?
它应该是错误的。归档 89686 (... and already fixed!) The grammar in [expr.prim.lambda.capture] 是:
capture:
simple-capture...
opt
...
opt init-capture
您可以简单捕获(即xs...
)或 你可以有一个 init-capture (这将是 ...xs=xs
,一个 init-capture 需要有一个 初始化器)。你不能同时拥有两者。