lambdas examples c++ templates visual-c++ lambda variadic-templates

lambdas - lambda examples c++



Lambdas en plantillas variadic (1)

A partir de hoy (de acuerdo con CppCoreGuidelines ), debe usar {} brackets initializer. ¿Lo intentaste?

MyClass a{[] {}};

Utilizando Microsoft Visual C ++ 2013 (12.0), estoy encontrando errores en tiempo de compilación cuando uso un lambda en un constructor en una plantilla variadic. He logrado hervirlo como se muestra a continuación (ver las líneas con los comentarios de error ). Parece ser un error en 12.0 que no está presente en 14.0. No he probado otras versiones. ¿Hay alguna documentación sobre este error, tal vez en la forma de una nota de lanzamiento que aclare las condiciones bajo las cuales se produce este error y que establece que se ha corregido de manera explícita?

#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; }