Korzystając z Microsoft Visual C++ 2013 (12.0), napotykam błędy kompilacji podczas używania lambda w konstruktorze w szablonie variadic. Udało mi się go zagotować, jak pokazano poniżej (patrz linie z komentarzami error
). Wygląda na to, że jest to błąd w wersji 12.0, którego nie ma w 14.0. Nie próbowałem innych wersji. Czy istnieje jakakolwiek dokumentacja dotycząca tego błędu, być może w formie notatki do wydania, która wyjaśnia warunki, w których występuje ten błąd i która stwierdza, że zostało to wyraźnie naprawione?Lambdas w szablonach variadic
#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;
}
Właśnie dodałem '#include' i zostało skompilowane. Użyłem Microsoft Visual Studio Community 2015 Wersja 14.0.25431.01 Aktualizacja 3 –
wally
Dziwne. Mam '#include' w moim kodzie (zapomniałem uwzględnić w kopiuj-wklej), ale nadal narzeka na mnie. –
Jako gcc & clang zaakceptuj kod ([Demo] (http://coliru.stacked-crooked.com/a/86fa0b4c990af350)). Powiedziałbym błąd msvc (jeszcze bardziej z twoim szablonem i testem szablonu variadic). – Jarod42