z gcc 4.9 -std = C++ 14, starałem dokonywania wektor lambdas:Korzystanie z listy initializer z lambda w pętli zakres oparte
vector<function<void()>> v = {[]{cout << "foo";}, []{cout << "bar";}};
for (auto&& a: v) a();
I to działało całkiem dobrze. Potem próbowałem przekazując listę initializer z lambdas do zakresu oparte na wprost:
for (auto&& a: {[]{cout << "foo";}, []{cout << "bar";}}) a();
I mam:
error: unable to deduce 'std::initializer_list<auto>&&' from '{<lambda closure object>main()::<lambda()>{}, <lambda closure object>main()::<lambda()>{}}'
Sądząc po wyglądzie komunikatem o błędzie, zrobiłem dziką domyślać, że prawdopodobnie jest tak dlatego, że "obiekt zamknięcia lambda" są wbudowanymi terminami w języku, a nie bezpośrednimi odpowiednikami std :: function (więc nie ma prawdziwych typów).
Jaka jest głębsza tego przyczyna? Czy może to być związane z wdrażaniem lub takie zachowanie jest podyktowane specyfikacją?
[A usztywnione inicjatora ma typ] (https://www.youtube.com/watch?v=wQxj20X -tIU # t = 1799). Co wyjaśnia, dlaczego nie możesz tego wydedukować. – Borgleader
@Borgleader to tutaj nie ma znaczenia, * spreparowana lista-inicjałów * w * zakresie na podstawie pętli * może zostać wydedukowana jako 'initializer_list' of * something * –
@Borgleader Yes, która również przeszła mi przez myśl. Wydaje się jednak, że z komunikatu o błędzie kompilator próbuje utworzyć wpisany. To sprawia, że nie jestem pewien, czy jest to błąd listy inicjalizacyjnej, która nie ma typu lub zamknięcia lambda, nie działa dobrze z nim. –