this(信じられないほどよく書かれた)記事については、転送参考をScott Meyersが受け取りました。今C++:転送に関する参照
、記事のこの部分に焦点を当てる:
template <class... Args> void emplace_back(Args&&... args); // deduced parameter types ⇒ type deduction; ... // && ≡ universal references
ので、他の例とは対照的に、楕円は&&
右辺値参照を作成しませんが、それはまだ普遍的な参照です。私が理解したものから
、我々は普遍的な参照を持っているとき、私たちは(、すごいかっこいい!)右辺と左辺値の両方を渡して関数を呼び出すことができ
さて、私はこの機能を実装しました:
template <typename ReturnType, typename... Args>
ReturnType callFunction(MemFunc<ReturnType, Args...> memFunc, Args&& ... args) { ...
したがって、前述の例と同じロジックを使用して、&&
は転送参照を意味します。
しかし、私はこの呼び出しにしようとします
typedef vector<double> vecD;
vecD vec;
mem.callFunction<vecD, vecD>(sortFunc, vec);
をコンパイラはこれが起こるのはなぜYou cannot bind an lvalue to an rvalue reference
と文句を言うために起こっていますか?
WHOLE 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);
}
*ユニバーサル*参考文献は非常に初めからひどい言葉でしたが、最終的にははるかに適切な*フォワーディング*レフェレンスに置き換えられました。 – SergeyA
あなたの呼び出しで 'Args'が実際に*推測*されていますか? –
私は本当のMCVEを見たいです。スニペットからうまくいくはずです。 – SergeyA