c++ - funktionen - Lambdas in variablen Schablonen



lambda funktionen c++ (1)

Ab heute (nach CppCoreGuidelines ) sollten Sie {} Klammern Initialisierer verwenden. Hast Du es versucht?

 MyClass a{[] {}};

Bei Verwendung von Microsoft Visual C ++ 2013 (12.0) treten bei der Verwendung eines Lambda in einem Konstruktor in einer variadischen Vorlage Fehler bei der Kompilierungszeit auf. Ich habe es geschafft, es wie unten gezeigt zu kochen (siehe die Zeilen mit den error ). Es scheint ein Fehler in 12.0 zu sein, der in 14.0 nicht vorhanden ist. Ich habe keine anderen Versionen ausprobiert. Gibt es eine Dokumentation zu diesem Fehler, vielleicht in Form eines Release-Hinweises, der die Bedingungen erläutert, unter denen dieser Fehler auftritt und angibt, dass dieser Fehler explizit behoben wurde?

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




variadic-templates