Ошибка вложенной лямбда-компиляции Visual Studio 2019

#c #visual-studio #visual-c #compiler-errors #visual-studio-2019

#c #visual-studio #visual-c #ошибки компилятора #visual-studio-2019

Вопрос:

Я обнаружил то, что кажется ошибкой компилятора в Visual Studio 2019 (toolset v142). Вот минимальный фрагмент кода для самостоятельного тестирования:

 #include <functional>
#include <vector>
#include <iostream>

int main()
{
    auto someLamb = [amp;]()
    {
        enum EnumA { eFoo = 0, eBar = 1, eCount = 2 };
        enum EnumB { eUndefined = -1, eFirst = 0 };
        std::vector<EnumB> edgesChanges;
        edgesChanges.push_back(EnumB::eUndefined);
        edgesChanges.push_back(EnumB::eUndefined);

        auto innerLamb = [amp;]()
        {
            int a = edgesChanges[EnumA::eFoo];
            int b = EnumB::eFirst;
            int c = edgesChanges[EnumA::eBar];
            int d = EnumB::eFirst;
            return a == b || c == d;
        };
        std::cout << "Hello World!n" << innerLamb();
    };
    someLamb();
}
  

Я получаю это в выходных данных:

 error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'main:: 
<lambda_82d455ec4380498d1fafa4212566d992>::()::<lambda_02e80f24e36a566682364f879a75c75d>'

message : No constructor could take the source type, or constructor overload resolution was ambiguous
  

Обратите внимание, что лямбды вложены. Если внешний лямбда-код удален, он компилируется нормально.
Я делаю что-то не так?

Комментарии:

1. Чтобы это сработало, вам нужно скомпилировать с. /std:c latest Я не уверен, должен ли я включить это в ответ или нет, потому что я не могу найти этому объяснение.

2. Я знаю об /std:c latest этом, но, к сожалению, я не могу полагаться на изменяющийся стандарт кода в производственной среде. Мне просто интересно, было ли что- то , что я пропустил

3. Я не вижу ничего плохого в том, что вы сделали, и я не могу найти ничего в списке поддержки компилятора C , что могло бы объяснить поведение MSVC. Какой стандарт C вы используете? C 14 или C 17?

4. Одним из обходных путей может быть определение enum s вне лямбда-кода. Похоже, это работает в MSVC как в режиме C 14, так и в режиме C 17. пример

5. более минимальным примером может быть godbolt.org/z/ooWPzM кажется, захватывает экземпляр перечисления, объявленного внутри лямбда-выражения, что вызывает проблему