不理解左值的双重转发 - 当通过值传递时

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?这个左值在什么时候变成右值并被移动?

Hol*_*Cat 5

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(因为模板参数不是(左值)引用).