Я столкнулся со странной проблемой. Следующий упрощенный код воспроизводит проблему в MSVC 2010:
template
struct dummy
{
static T foo(void) { return T(); }
};
int main(void)
{
typedef dummy dummy_type;
auto x = []{ bool b = dummy_type::foo(); };
// auto x = []{ bool b = dummy::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, возможно.)
от N3000, 5.1.2 / 6,
лямбда-экспрессия Соединение-оператор дает Функциональное тело (8.4) функции Оператор звонка, но для целей Название поиска (3.4), ... Соединение-оператор считается в контекст лямбда-выражения.
Неудивительно, что локальный тип должен быть виден.
Это на самом деле не является ответом на ваш вопрос, но просто исследуя проблему дальше. Мне было интересно, имеет ли компилятор проблемы с видом типов , объявленные в ограждении, поэтому попробовал это:
#include <iostream>
template <typename Func>
void do_test(Func pFunc) {
}
template <typename T>
void test_trait(void) {
class Something { public: int foo; };
do_test ([] (T pX) {
Something A; A.foo = 12;
});
}
int main(void) {
test_trait<int> ();
}
здесь, я просто пытаюсь создать локальный тип в прилагаемой области и использовать его изнутри лямбда. Это не только не только компилярует (с Visual Studio 2010, Beta 2), но он фактически выбивает компилятор с внутренней ошибкой C1001.
Я подал две сообщения об ошибках.
Посмотрим, как он идет. :)
Обе ошибки были помечены как фиксированные:
Мы ценим вашу отзыв. Эта ошибка была замечена нами раньше, и мы исправили его в следующем выпуске. Спасибо за использование продукта.
Спасибо,
Ulzii luvsanbat
Windows C ++ команда
Так что мы идем.
Перечисления, локальные для функций, также не могут быть обнаружены лямбда-выражениями.
int main()
{
enum E {A, B, C};
auto x = [](){ int a = A; };
//auto y = [](){ E a = A; }; // this will crash the compiler
}
ошибка C3493: 'A' не может быть неявно захвачен, потому что не указан режим захвата по умолчанию
Ниже приводится рабочий прием, но, возможно, проблематичный.
int main()
{
enum E {A, B, C};
auto x = [=](){ int a = A; };
// typedef E F;
// auto y = [=](){ F a = A; }; // this compiles ok
}