Mince.
Ca vient peut-être du fait que chaque lambda pourrait bien avoir un type unique. Du coup, decltype(f2) != decltype(f) ; mais la norme C++ dit que les messages d'erreur doivent être le plus simple possible - du coup, le compilateur transforme le type réel en un nom de type lisible (et il apparait identique, vu que la signature des lambda est identique).
http://liveworkspace.org/code/2jJoBz$33
source.cpp: In instantiation of 'std::array<T, (sizeof (Args ...) + 1)> make_array(T, Args ...) [with T = main()::__lambda0; Args = {main()::__lambda1}]':
T = main()::__lambda0
Args = {main()::__lambda1}
===> type unique
make_array générique:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<array>
#include<functional>
template<typename U, typename T, typename ... Args>
auto make_array(U u, T t, Args ... args) -> std::array< decltype(u), sizeof...(Args)+1> {
return {{t, args...}};
}
int main() {
auto f = [](int i)->int { return i; };
auto f2 = [](int i)->int { return i*2; };
auto arr2 = make_array(std::function<int(int)>(), f, f2);
return 0;
} |
Partager