onq*_*tam 1 c++ rvalue-reference perfect-forwarding c++11
#include <iostream>
#include <vector>
#include <type_traits>
#include <utility>
using namespace std;
template <typename Func, typename... Args>
void proxy(Func f, Args&&... args) {
f(std::forward<Args>(args)...);
}
void real_func(vector<int> v) {
cout << "size: " << v.size() << endl;
}
void multicast_func(vector<int> v) {
proxy(real_func, std::forward<vector<int>>(v));
proxy(real_func, std::forward<vector<int>>(v));
}
int main()
{
vector<int> ints = {1, 2, 3};
multicast_func(ints);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
size: 3
size: 0
Run Code Online (Sandbox Code Playgroud)
为什么不是3,3?这个左值在什么时候变成右值并被移动?
std::forward 旨在与通用参考一起使用.
参数multicast_func不是通用引用,所以std::forward没有意义:
void multicast_func(vector<int> v) {
proxy(real_func, std::forward<vector<int>>(v));
proxy(real_func, std::forward<vector<int>>(v));
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它有效地起作用std::move(因为模板参数不是(左值)引用).