我阅读了 Scott Meyers 的这篇(写得非常好)关于C++11 中的转发参考的文章。
现在,关注本文的这一部分:
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
为什么会发生这种情况?
整个代码:
#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);
}