Согласно ответам и комментариям для этого вопроса , когда ссылочная переменная захватывается по значению, лямбда-объект должен делать копию ссылочного объекта, а не самой ссылки. Однако GCC, похоже, этого не делает.
Используя следующий тест:
#include
#include
using std::cout;
using std::endl;
int main(int argc, char** argv)
{
int i = 10;
int& ir = i;
[=]
{
cout << "value capture" << endl
<< "i: " << i << endl
<< "ir: " << ir << endl
<< "&i: " << &i << endl
<< "&ir: " << &ir << endl
<< endl;
}();
[&]
{
cout << "reference capture" << endl
<< "i: " << i << endl
<< "ir: " << ir << endl
<< "&i: " << &i << endl
<< "&ir: " << &ir << endl
<< endl;
}();
return EXIT_SUCCESS;
}
Компиляция с GCC 4.5.1 с использованием -std = c ++ 0x
и запуск дает следующий результат :
value capture
i: 10
ir: -226727748
&i: 0x7ffff27c68a0
&ir: 0x7ffff27c68a4
reference capture
i: 10
ir: 10
&i: 0x7ffff27c68bc
&ir: 0x7ffff27c68bc
При копировании ir
просто ссылается на ненужные данные. Но он правильно ссылается на i
при захвате по ссылке.
Это ошибка в GCC? Если да, то кто-нибудь знает, исправит ли это более поздняя версия? Каково правильное поведение?
Если первая лямбда-функция изменяется на
[i, ir]
{
cout << "explicit value capture" << endl
<< "i: " << i << endl
<< "ir: " << ir << endl
<< "&i: " << &i << endl
<< "&ir: " << &ir << endl
<< endl;
}();
, то вывод выглядит правильным:
explicit value capture
i: 10
ir: 10
&i: 0x7fff0a5b5790
&ir: 0x7fff0a5b5794
Это все больше и больше похоже на ошибку.