f1
和f2
有什么区别吗?
void foo(const std::string& test){
auto f1 = [&test](){
std::cout << test << std::endl;
};
f1();
auto f2 = [test](){
std::cout << test << std::endl;
};
f2();
}
int main()
{
std::string x = "x";
foo(x);
}
看起来在这两种情况下,lambda内部的test
变量的类型将是std::string const&
,但它是否真的相同?
f1和f2之间有什么区别吗?
是。
但它真的一样吗?
没有.f2
捕获了std::string const
。
lambda捕获的类型推导与auto
声明的工作原理相同:
[&test](){} // a reference
[ test](){} // an object
auto &var = test; // a reference
auto var = test; // an object
std::string &var = test; // a reference
std::string var = test; // an object
template<class T> void foo1(T& var);
template<class T> void foo2(T var);
foo1(test); // a reference
foo2(test); // an object