Ich lese this (unglaublich gut geschrieben) Artikel über Forwarding Referenz in C++ 11 von Scott Meyers.C++: Verwirrung über Weiterleitung Referenz
Nun konzentrieren sich auf diesem Teil des Artikels:
template <class... Args> void emplace_back(Args&&... args); // deduced parameter types ⇒ type deduction; ... // && ≡ universal references
Also, im Gegensatz zu anderen Fällen, die Ellipsen machen nicht die &&
rvalue Referenz, aber es ist noch universal Referenzen.
Von dem, was ich verstanden habe, wenn wir universelle Referenzen haben wir die Funktion sowohl rvalue anrufen und lvalues vorbei (wow, so cool)
Jetzt habe ich diese Funktion implementiert:
template <typename ReturnType, typename... Args>
ReturnType callFunction(MemFunc<ReturnType, Args...> memFunc, Args&& ... args) { ...
Also (&&
) (die gleiche Logik des vorherigen Beispiels verwendend) bedeutet Weiterleitungsreferenzen.
Aber wenn ich versuche, diesen Anruf zu machen:
typedef vector<double> vecD;
vecD vec;
mem.callFunction<vecD, vecD>(sortFunc, vec);
Der Compiler mit You cannot bind an lvalue to an rvalue reference
beschweren wird, warum dies geschieht?
der gesamte Code:
#include <functional>
#include <vector>
using namespace std;
struct MultiMemoizator {
template <typename ReturnType, typename... Args>
ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, Args&&... args) {
}
};
typedef vector<double> vecD;
vecD sort_vec (vecD const& vec) {
return vec;
}
int main()
{
vecD vec;
std::function<vecD(vecD)> sortFunc(sort_vec);
MultiMemoizator mem;
mem.callFunction<vecD, vecD>(sortFunc, vec);
}
* Universal * Referenzen war schrecklich von Anfang an, und jetzt ist es endlich mit viel mehr geeignet * Weiterleitung * Verweis ersetzt. – SergeyA
Sind Sie sicher, dass "Args" tatsächlich * in Ihrem Anruf * abgeleitet wurde? –
Ich würde gerne echte MCVE sehen. Aus dem Snippet sollte es gut funktionieren. – SergeyA