On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 19:05. Заголовок: MS VC++ 2010 баг при использовании вложенных лямбда выражениях


Приведенный здесь код написан на основе примера из раздела стандарта С++ 2011 5.1.2 "Lambda Expressions", который должен демонстрировать, как "захватываются" (captured) переменные во вложенных лямбда выражениях.

Вот этот код

#include <iostream> 


int main()
{
{
int a = 1, b = 1, c = 1;

auto m1 = [ a, &b, &c ] () mutable
{
auto m2 = [ a, b, &c ] () mutable
{
std::cout << a << b << c;
a = b = c = 4;
};

a = b = c = 3;
m2();
};

a = b = c = 2;
m1();
std::cout << a << b << c;
}
}


Согласно стандарту результатом работы этого кода должен быть вывод на консоль следующей строки

123234

У кого есть интерес и желание, могут поломать голову, почему именно такой результат должен быть выведен. Это отдельная тема для разговора, которая заслуживает внимание, если хотите освоить работу лямбда-выражений. Пока лишь замечу, что увлечение включением в код вложенных лямбда выражений делает код трудно воспринимаемым, и может стать источником серьезных ошибок.

Приведенный пример не компилируется MS VC++ 2010. При компиляции выдается серия сообщений об ошибках, по одной для каждой захваченной переменной во внутреннем лямбда выражении m2.
Вот эти ошибки:

error C3480: `anonymous-namespace'::<lambda2>::a: передаваемая переменная в лямбда-выражении должна быть из внешней области видимости функции
error C3480: `anonymous-namespace'::<lambda2>::b: передаваемая переменная в лямбда-выражении должна быть из внешней области видимости функции
error C3480: `anonymous-namespace'::<lambda2>::c: передаваемая переменная в лямбда-выражении должна быть из внешней области видимости функции

Однако если тот же самый код компилировать с помощью онлайнового компилятора, то он успешно компилируется и выполняется.


Надо отметить, что обработка лямбда выражений в компиляторах Майкрософт появилась задолго до принятия стандарта. Если я не ошибаюсь, они присутствовали еще в MS VC++ 2008. Тем не менее не наблюдается, что за это время обработка лямбда выражений получила более-менее полную поддержку в MS VC++ 2010.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 28.07.12 19:07. Заголовок: Поступил ответ от Ма..


Поступил ответ от Майкрософт на это сообщение о баге компилятора. Согласно их ответу, это действительно баг. Но, похоже, в текущей разрабатываемой версии компилятора этот баг исправлен. В следующем главном (каком именно?) релизе компилятора, как уверяется, будет содержаться исправление.
Вот текст ответа Майкрософт


 цитата:
Posted by Microsoft on 20.02.2012 at 13:01

Hello,

Thank you for reporting this bug. We've taken a look at this for current in-development build of Visual C++ compiler, and fixed it. Next major release of Visual C++ will have the fix, and we'll make sure it doesn't regress again.

Thanks,
Ulzii Luvsanbat
Visual C++ Team



Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет