5

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

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);
}

它打印

2
3
2

但是在lambda 调用时应该T t1(t); Tint&这样。为什么没有输出t1int&test(t1)

2
3
3
4

2 回答 2

7

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

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

如果t1是指针,您将按值获取指针。但是您无法“按价值”获得参考;你只能得到被引用的值。

于 2012-08-26T10:05:06.853 回答
2

通过按值捕获,[=]您的 lambda 获得了t1它传递给的本地副本test(),因此 lambda 中发生的任何事情t1都不会影响原始t对象。

于 2012-08-26T10:00:18.310 回答