Warum kann der Compiler den Template-Parameter für std::forward
nicht ableiten?Understanding std :: forward
ich meine:
#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());
}
Ich weiß, dass dies eine Design-Wahl (aufgrund der std::remove_reference
in der Definition von std::forward
) ist der Benutzer zu vermeiden, vergessen Sie den Typen angeben. Was ich nicht bekommen kann, ist: warum die Art und Weise, wie es implementiert wird, um eine Deduktion zu verhindern? Warum der Compiler nicht nur den Vorlagenparameter forward
als Arg
ableitet.
Können Sie die Frage klären? Fragen Sie, warum das Design gewählt wurde, um Argumentabzüge zu vermeiden, oder warum die Art und Weise, wie es implementiert wurde, einen Abzug verhindert? – Angew
Der Punkt, an dem der Typ manuell angegeben wird, ist so, dass "vorwärts" entscheiden kann, ob er sich "bewegen" soll oder nicht. Template Argument Abzug lässt Sie den Typ von "a" herausfinden, aber nicht, ob es bewegt werden soll oder nicht. – nwp
@Angew Der zweite. –