C ++ std :: forward没有T&&

时间:2017-05-12 10:05:53

标签: c++

template<typename...Ts>
struct Wrapper{
    using result_type = void (*)(Ts...);

    template<typename T, T (*P)(Ts...)>
    static result_type wrap(){
        return [](Ts...ts) {
            P(forward<Ts>(ts)...); // The forward is required, or the code below will fail.
        };
    };

};

int fun(int&& i, int& j, int k) {
    return 0;
}

auto wrapped = Wrapper<int&&, int&, int>::wrap<int, fun>();
int i = 2;
wrapped(1, i, 3);

它有效,问题是,当传递一个无引用类型时,forward会将它转换为rvalue,这意味着在上面的代码中将移动第三个参数。那么如何在没有T&amp;&amp;?

的情况下转发确切的类型

1 个答案:

答案 0 :(得分:1)

您可以在此处使用static_cast代替forward,因为您的目标是转换为Ts...中指定的确切类型:

// ...
P(static_cast<Ts>(ts)...);
// ...