Лямбда-копирование ссылки на лямбда-ссылку VS2017 ошибка компиляции - PullRequest
7 голосов
/ 26 марта 2019

Компиляция следующего кода в Visual Studio 2017:

#include "pch.h"
#include <iostream>

int main()
{
    int test = 5;

    auto cb1 = [test]()
    {
        auto cb2 = [&]()
        {
            auto cb3 = [test]()
            {
                std::cout << test;
            };
            cb3();
        };
        cb2();
    };
    cb1();
}

выдает ошибку компилятора

test.cpp(17): error C2440: '<function-style-cast>': cannot convert from 'const int' to 'main::<lambda_80fd0d4feae1377a5d8b8955e10105ab>::()::<lambda_38fc83ae6a7bd6540ebe1721869db4f1>'
test.cpp(17): note: No constructor could take the source type, or constructor overload resolution was ambiguous
test.cpp(18): error C3536: 'cb2': cannot be used before it is initialized
test.cpp(18): error C2064: term does not evaluate to a function taking 0 arguments

Кто-нибудь знает, почему Visual Studio выдает эту ошибку? (кажется, что он хорошо компилируется на clang) Вы можете заставить его скомпилировать, заменив auto cb2 = [&]() на auto cb2 = [&test](), почему это исправляет ошибки?

Еще интереснее, добавление std::cout << test; или const int &ref = test; в тело cb2 исправляет ошибку компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...