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