Подтвердить что ты не робот

Lambdas в вариативных шаблонах

Используя Microsoft Visual С++ 2013 (12.0), я сталкиваюсь с ошибками во время компиляции при использовании лямбда в конструкторе в вариационном шаблоне. Мне удалось сварить его, как показано ниже (см. Строки с комментариями error). Кажется, это ошибка в 12.0, которой нет в 14.0. Я не пробовал другие версии. Есть ли какая-либо документация по этой ошибке, возможно, в виде примечания к выпуску, которая разъясняет условия, при которых возникает эта ошибка, и которая заявляет, что она была явно исправлена?

#include <functional>

// a simple method that can take a lambda
void MyFunction(const std::function<void()>& f) {}

// a simple class that can take a lambda
class MyClass
{
public:
    MyClass(const std::function<void()>& f) {}
};

// non-templated test
void test1()
{
    MyFunction([] {}); // OK
    MyClass([] {}); // OK
    MyClass o([] {}); // OK
}

// non-variadic template test
template<typename T>
void test2()
{
    MyFunction([] {}); // OK
    MyClass([] {}); // OK
    MyClass o([] {}); // OK
}

// variadic template test
template<typename... T>
void test3()
{
    MyFunction([] {}); // OK
    MyClass([] {}); // OK
    MyClass a([] {}); // error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
                      // error C2440: 'initializing' : cannot convert from 'test3::<lambda_12595f14a5437138aca1906ad0f32cb0>' to 'int'

    MyClass b(([] {})); // putting the lambda in an extra () seems to fix the problem
}

// a function using the templates above must be present
int main()
{
    test1();
    test2<int>();
    test3<int, int, int>();
    return 1;
}
4b9b3361

Ответ 1

Вам нужно передать непустую функцию labda конструктору вашего класса вот так:

MyClass a([] {cout << "This should work"; });

Ответ 2

На сегодняшний день (согласно CppCoreGuidelines), вы должны использовать {} скобки-инициализатор. Вы попробовали?

 MyClass a{[] {}};