Я прочитал this (невероятно хорошо написанный) статья о Справочник по отправке в C++ 11 от Scott Meyers.C++: путаница в отношении ссылки на пересылку
Теперь акцент на этой части статьи:
template <class... Args> void emplace_back(Args&&... args); // deduced parameter types ⇒ type deduction; ... // && ≡ universal references
Таким образом, в отличие от других случаев, эллипсы не делают &&
ссылку RValue, но это все-таки универсальные ссылки.
Из того, что я понял, когда у нас есть универсальные ссылки, мы можем вызвать функцию, проходящую как RValue и lvalues (! Вау, круто)
Теперь я реализовал эту функцию:
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
Почему это происходит?
ВЕСЬ КОД:
#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