У меня возникла странная проблема. Следующий упрощенный код воспроизводит проблему в 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++ для тестирования, прямо сейчас. Это какое-то странное правило в С++ 0x или просто ошибка в компиляторе?
Из приведенных выше результатов я склоняюсь к ошибке. Хотя авария определенно является ошибкой.
В настоящее время я зарегистрировал два отчета об ошибках.
Все фрагменты кода выше должны компилироваться. Ошибка связана с использованием разрешения области видимости на локально определенных объектах. (Пятнистый dvide.)
И ошибка сбоя связана с... кто знает.:)
Update
Согласно отчетам об ошибках , они оба исправлены для следующей версии Visual Studio 2010. (Хотя это, похоже, не так, VS11 возможно.)