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

C++ C++;11 lambda捕获列表[=]使用引用,c++,lambda,c++11,capture,C++,Lambda,C++11,Capture,当我捕获一个值,但值类型是模板函数中的引用时 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 &

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

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);
}
但在
tt1(T)
T
int&
所以当lambda调用
test(t1)
t1
应该是
int&
。为什么输出不正确

2
3
3

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

T是int&因此t1应该是int&

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

如果
t1
是指针,则将按值获取指针。但是你不能“按值”得到一个引用;您只能获取被引用的值。

I在lambda中测试。[=]()可变的{mytesttypecode(decltype(t1));返回测试(t1);}();t1是int&。有些不好的事情我想。。。。。
2
3
3