Perché il compilatore non è in grado di dedurre il parametro del modello per std::forward
?Informazioni su std :: forward
voglio dire:
#include <memory>
#include <iostream>
struct X{};
struct A{
A(const X&) { std::cout << "cpy ctor\n"; }
A(X&&) { std::cout << "move ctor\n"; }
};
X foo() { return {}; }
template<typename T,typename Arg>
T* factory(Arg&& a)
{
return new T(std::forward(a));
// ----------^^^^^^^^^^^^^^^ error: can't deduce template parameter
}
int main()
{
factory<A>(foo());
}
So che questa è una scelta di progettazione (a causa della std::remove_reference
nella definizione di std::forward
) per evitare che l'utente dimentica di specificare il tipo. Quello che non riesco a ottenere è: perché il modo in cui viene implementato funziona per prevenire la detrazione? Perché il compilatore non si limita a dedurre il parametro del modello forward
come Arg
.
Potete chiarire la domanda? Stai chiedendo perché il design è stato scelto per evitare la deduzione degli argomenti, o perché il modo in cui viene implementato funziona per prevenire la deduzione? – Angew
Il punto di specificare manualmente il tipo è tale che 'forward' può decidere se deve" spostarsi "' a' o meno. La deduzione degli argomenti del modello ti consente di capire il tipo di 'a', ma non se deve essere spostato o meno. – nwp
@Angew Il secondo. –