Являются видимыми функционально-локальные определения типов в C++ 0x лямбды?

Я столкнулся со странной проблемой. Следующий упрощенный код воспроизводит проблему в 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, возможно.)

12
задан Community 23 May 2017 в 10:30
поделиться

4 ответа

от N3000, 5.1.2 / 6,

лямбда-экспрессия Соединение-оператор дает Функциональное тело (8.4) функции Оператор звонка, но для целей Название поиска (3.4), ... Соединение-оператор считается в контекст лямбда-выражения.

Неудивительно, что локальный тип должен быть виден.

9
ответ дан 2 December 2019 в 20:17
поделиться
-

Это на самом деле не является ответом на ваш вопрос, но просто исследуя проблему дальше. Мне было интересно, имеет ли компилятор проблемы с видом типов , объявленные в ограждении, поэтому попробовал это:

#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.

2
ответ дан 2 December 2019 в 20:17
поделиться

Я подал две сообщения об ошибках.

Посмотрим, как он идет. :)


Обновление

Обе ошибки были помечены как фиксированные:

Мы ценим вашу отзыв. Эта ошибка была замечена нами раньше, и мы исправили его в следующем выпуске. Спасибо за использование продукта.

Спасибо,
Ulzii luvsanbat
Windows C ++ команда

Так что мы идем.

2
ответ дан 2 December 2019 в 20:17
поделиться

Перечисления, локальные для функций, также не могут быть обнаружены лямбда-выражениями.

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
}
3
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: