Казалось бы, что уже трудно найти новый баг компилятора MS VC++ 2010, относящийся к лямбда-выражениям, после уже обнаруженых мною ранее нескольких багов. Однако это не так, и список багов для лямбда-выражений компилятора MS VC++ 2010 придется пополнить еще одним багом.
На этот раз компилятор MS VC++ 2010 неправильно осуществляет поиск имен при определнии лямбда-выражения внутри класса.
Вот пример программы, демонстрирующий этот изъян.
#include "stdafx.h"
void f( int ) {}
struct
{
void f() {}
void g()
{
[=] { f(); } ();
}
} a;
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
При компиляции этого кода компилятор MS VC++ 2010 выдает следующее сообщение об ошибке:
цитата: |
error C2660: f: функция не принимает 0 аргументов |
|
То есть при поиске имени
f в лямбда-выражении компилятор не замечает это имя, объявленное внутри неименованного класса (это не имеет значения, именован класс или нет), а начинает поиск имени
f за пределами класса. Так как он находит в глобальном пространстве имен функцию
f, принимающую один параметр, а в лямбда-выражении функция с таким именем вызывается без аргументов, то компилятор и сообщает об ощибке.
При компиляции этого кода компилятором GCC 4.7.0 никакой ошибки не возникает.
Порадую Майкрософт новым сообщением о баге их компилятора!