Bonjour.
J’ai récemment rencontré une erreur que je n’arrive pas à comprendre dans le cadre d’un projet C++. Mon compilateur ne parvient pas à convertir un type en référence universelle sur ce type (si j’ai bien compris) dans une fonction template.
Voici le code minimal:
#include <iostream>
#include <typeinfo>
struct Functor
{
template <typename T>
void operator()(void) const
{
std::cout << "Calling Functor<" << typeid(T).name() << ">::operator()(void) const\n";
}
};
template <typename Fn, typename First, typename Second, typename... Others>
void execAll(Fn&& callback)
{
execAll<Fn, First>(callback);
execAll<Fn, Second, Others...>(callback);
}
template <typename Fn, typename Last>
void execAll(Fn&& callback)
{
callback.template operator()<Last>();
}
int main(void)
{
execAll<Functor, int, long, float, double, char>(Functor());
return 0;
}
Ce qui m’intrigue particulièrement est que ce code fonctionne très bien quand je retire la mention "référence universelle" derrière Fn
(transformant Fn&&
en Fn
).
Ma question est donc : pour quelle raison cette erreur a t-elle lieu et que puis-je faire pour que ma fonction accepte les références?
+0
-0