2012-08-26 21 views
5

を使用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); 
} 

2 
3 
2 

しかしに印刷しますT t1(t);Tは、ラムダが​​を呼び出したときにt1int&あるべきint&です。なぜ出力ではありません、あなたのラムダは、それがtest()に渡すt1のローカルコピーを取得し、そのキャプチャバイ値[=]を通じて

2 
3 
3 

答えて

7

Tは&ので、t1は&

参照はポインタではありませんint型でなければなりませんintです。 Tしたがってt1が参照され、int&として推定することができます。しかし、あなたはt1をキャプチャするためにラムダを尋ねました。それはt1によって参照をコピーすることを意味します。

t1がポインタであれば、あなたは値によってポインタになるだろう。しかし、あなたは "価値によって"参照を得ることはできません。参照されている値しか取得できません。

+0

私はラムダでテストします。 [=]()mutable {mytesttypecode(decltype(t1)); return test(t1);}(); t1はint&です。何か良いとは思わない..... – user1625647

2

tのオブジェクトに影響を与えることはありませんラムダにt1に起こるものは何でも。