转发可变参量列表

问题描述 投票:0回答:1

以下两个代码均按预期方式编译和执行,是否有所不同?

template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U...>(args...));
    std::cout<<"timing over"<<std::endl;
    return val;
}

    template<typename T, typename ...U>
auto time_function(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U>(args)...);
    std::cout<<"timing over"<<std::endl;
    return val;
}

看SO How would one call std::forward on all arguments in a variadic function?,似乎建议使用第二个,但第一个不做同样的事情吗?

c++11 templates c++14 metaprogramming perfect-forwarding
1个回答
0
投票

它们不一样。在args的Arity为1的情况下它们是相同的,否则将无法编译,请考虑。.

#include <iostream>
using namespace std;
template<typename T, typename ...U>
auto time_function_1(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U...>(args...));
    std::cout<<"timing over"<<std::endl;
    return val;
}

    template<typename T, typename ...U>
auto time_function_2(T&& func, U&& ...args)
{

    std::cout<<"timing"<<std::endl;
    auto val = std::forward<T>(func)(std::forward<U>(args)...);
    std::cout<<"timing over"<<std::endl;
    return val;
}



int f (int){return 0;}

int y (int,int){return 0;}

int main() {
    time_function_1(f,1);
    time_function_2(f,1);

    time_function_1(y,1,2); // fail
    time_function_2(y,1,2);
    return 0;
}

Demo

[std::forward<U...>(args...)扩展为forward<int, int>(int&, int&),将无法编译。

© www.soinside.com 2019 - 2024. All rights reserved.