【发布时间】:2016-08-18 22:41:32
【问题描述】:
我阅读了 this(写得非常好)关于由 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);
}
【问题讨论】:
-
Universal 引用从一开始就是一个糟糕的术语,现在它终于被更合适的 forwarding 引用所取代。
-
你确定
Args实际上是在你的通话中推导出来的吗? -
请提供minimal reproducible example。提供的代码不完整(
sort_vec是什么?),而且肯定不是最小的。 -
@bolov 就好像他们只是想查看相关的代码!
-
@justHelloWorld 每个人都是对的:1.您的 sn-p 中缺少一些部分,2.您的代码包含许多与您的问题无关的内容,3.这些与您的问题完全无关, 4. 代码可以是最少的并且可以为编译器工作。 This 可能是您的问题的一个很好的 MCVE,它有 25 行长。
标签: c++ c++11 move move-semantics forwarding-reference