Подтвердить что ты не робот

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

В соответствии с ответами и комментариями для этого вопроса, когда ссылочная переменная захватывается значением, объект лямбда должен сделать копию ссылочного объекта, а не ссылка сама. Однако GCC, похоже, не делает этого.

Используя следующий тест:

#include <stddef.h>
#include <iostream>

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

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

4b9b3361

Ответ 1

Это только что было исправлено в ветке gcc-4.7 trunk и gcc-4.6. Они должны быть доступны в gcc-4.7.0 (через некоторое время - все еще в стадии 1) и gcc-4.6.2 (увы, как только вышел 4.6.1).

Но intrepid может ждать следующих снимков или получить копию подрывной работы.

Подробнее см. журнал аудита.

Ответ 2

Скомпилированный с VS 2010 дает:

value capture
i: 10
ir: 10
&i: 0012FE74
&ir: 0012FE78

reference capture
i: 10
ir: 10
&i: 0012FF60
&ir: 0012FF60

Похож на ошибку для меня.