Еще один баг компилятора MS VC++ 2010 обнаружился при явном "захвате" переменной вложенным лямбда-выражением, когда внешнее лямбда-выражение эту переменную явно не захватывает. Чтобы было понятно, о чем идет речь, обратимся сразу же к демонстрационному примеру.
#include "stdafx.h"
#include <iostream>
void f1( int i )
{
auto m1 = [=] { auto m2 = [ i ] { std::cout << i << std::endl; }; m2(); };
m1();
}
int _tmain(int argc, _TCHAR* argv[])
{
return ( 0 );
}
В этом примере лямбда-выражение
m2 в списке захваченных переменных явно указывает переменную
i, которая является параметром функции
f1. Согласно стандарту С++ 2011 это должно привести к неявному захвату переменной
i внешним лямбда-выражением
m1. То есть данная конструкция вложенных лямбда-выражений
auto m1 = [=] { auto m2 = [ i ] { std::cout << i << std::endl; }; m2(); };
эквивалентна следующей конструкции
auto m1 = [ i ] { auto m2 = [ i ] { std::cout << i << std::endl; }; m2(); };
в которой перменная
i явно захватывается лямбда-выражением
m1. Однако компилятор MS VC++ 2010 при компиляции исходного демонстрационного примера выдает сообщения об ошибках:
цитата: |
error C3481: i: передаваемая переменная в лямбда-выражении не найдена error C2065: i: необъявленный идентификатор error C2065: i: необъявленный идентификатор error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов |
|
Компилятор GCC 4.7.0, как и полагается, компилирует данный код без ошибок.
Фактически, в компиляторе MS VC++ 2010 лямбда-выражения лишь "обозначенны" или заявлены, но не реализованы в полной мере.