以下两个代码均按预期方式编译和执行,是否有所不同?
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?,似乎建议使用第二个,但第一个不做同样的事情吗?
它们不一样。在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;
}
[std::forward<U...>(args...)
扩展为forward<int, int>(int&, int&)
,将无法编译。