C++ 11 lambda捕获列表[=]使用引用

use*_*647 5 c++ lambda capture c++11

当我捕获值但值类型是模板函数中的引用时

template<class T>
void test(T&&i)
{
    ++i;
    std::cout << i << std::endl;
}

template<class T>
void typetest(T&& t)
{
    ++t;
    T t1(t);
    [=]() mutable { std::cout << t1 << std::endl; return test(t1); }();
    std::cout << t << std::endl;
}

int main()
{
    int i=1;
    typetest(i);
}
Run Code Online (Sandbox Code Playgroud)

它打印

2
3
2
Run Code Online (Sandbox Code Playgroud)

但是,当lambda调用时应该T t1(t); Tint&这样.为什么输出不是t1int&test(t1)

2
3
3
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 7

T是int,所以t1应该是int&

引用不是指针.T可以推断为int&,因此t1是一个参考.但是你要求lambda t1捕获.这意味着复制引用的t1.

如果t1是指针,您将按值获取指针.但你不能"按价值"得到参考; 你只能获得被引用的值.