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

しかし、ラムダが呼び出すときT t1(t); Tint&そうt1あるべきです。なぜ出力されないのですかint&test(t1)

2
3
3
4

2 に答える 2

7

Tはint&なので、t1はint&である必要があります

参照はポインタではありません。Tとして推定される可能性があるint&ためt1、参照です。しかし、ラムダにt1でキャプチャするように依頼しました。これは、によって参照されるをコピーすることを意味します。t1

ポインタの場合t1、値でポインタを取得します。ただし、「値で」参照を取得することはできません。参照されている値のみを取得できます。

于 2012-08-26T10:05:06.853 に答える
2

値によるキャプチャを通じて、ラムダはに渡す[=]ローカル コピーを取得するため、ラムダで何が起こっても元のオブジェクトには影響しません。t1test()t1t

于 2012-08-26T10:00:18.310 に答える