Я столкнулся со странной проблемой. Следующий упрощенный код воспроизводит проблему в MSVC 2010:
template <typename T>
struct dummy
{
static T foo(void) { return T(); }
};
int main(void)
{
typedef dummy<bool> dummy_type;
auto x = []{ bool b = dummy_type::foo(); };
// auto x = []{ bool b = dummy<bool>::foo(); }; // works
}
typedef
, который я создал локально в функции, кажется, не виден в лямбде. Если я заменю typedef
на фактический тип, он будет работать как положено.
Вот еще несколько тестов:
// crashes the compiler, credit to Tarydon
int main(void)
{
struct dummy {};
auto x = []{ dummy d; };
}
// works as expected
int main(void)
{
typedef int integer;
auto x = []{ integer i = 0; };
}
У меня нет g ++, чтобы проверить это прямо сейчас. Это какое-то странное правило в C ++ 0x или просто ошибка в компиляторе?
Из приведенных выше результатов я склоняюсь к ошибке. Хотя сбой определенно является ошибкой.
На данный момент я подал два сообщения об ошибках .
Все приведенные выше фрагменты кода должны быть скомпилированы. Ошибка связана с использованием разрешения области в локально определенных областях. (Замечено dvide .)
А ошибка при сбое связана с ... кто знает. :)
Обновление
Согласно сообщениям об ошибках , они оба были исправлены в следующем выпуске Visual Studio 2010. (Хотя это не так; VS11 возможно.)