Захват ссылочной переменной копированием в C ++ 0x lambda

Согласно ответам и комментариям для этого вопроса , когда ссылочная переменная захватывается по значению, лямбда-объект должен делать копию ссылочного объекта, а не самой ссылки. Однако 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

Это все больше и больше похоже на ошибку.

32
задан Community 23 May 2017 в 12:25
поделиться