我试图弄清楚为什么捕获的变量不能通过引用传递给foo函数,下面显示的程序不会编译并出现以下错误:
error: invalid initialization of reference of type
'Object&' from expression of type 'const Object'
有没有办法将通用引用完美地转移到lambda中,以便通过引用捕获它以供以后使用?类型T也可能是R值或R值和L值的组合,因此不能总是通过引用捕获它们。
struct Object
{
};
void foo(Object& a)
{
}
template<typename... T>
auto bar(T&&... values)
{
return [values...](){
foo(values...);
};
}
int main ()
{
Object obj;
auto lambda = bar(obj);
return 0;
}
答案 0 :(得分:1)
您可以通过捕获值来将值作为const成员存储在闭包内,并且它们不能绑定到非const左值引用。对于by-ref你来说,你忘了把&#39;&amp;&#39;在值之前:
return [&values...](){
foo(values...);
};
一个小例子。
两个文件之间唯一的区别:
diff omg.cpp nyan.cpp
6c6
< return [values...]{ foo(values...); };
---
> return [&values...]{ foo(values...); };
使用按值捕获编译一个:
$ g++ -std=c++14 omg.cpp && ./a.out
omg.cpp: In instantiation of ‘bar(T&& ...)::<lambda()> [with T = {int&}]’:
omg.cpp:6:16: required from ‘struct bar(T&& ...) [with T = {int&}]::<lambda()>’
omg.cpp:6:38: required from ‘auto bar(T&& ...) [with T = {int&}]’
omg.cpp:11:16: required from here
omg.cpp:6:25: error: binding reference of type ‘int&’ to ‘const int’ discards qualifiers
return [values...]{ foo(values...); };
~~~^~~~~~~~~~~
omg.cpp:3:6: note: initializing argument 1 of ‘void foo(int&)’
void foo(int &a) { std::cout << a << std::endl; }
^~~
编译另一个:
$ g++ -std=c++14 nyan.cpp && ./a.out
42
314