Variadic模板参数fowarding

时间:2016-06-10 22:04:04

标签: c++ templates variadic-templates

假设我有一个函数foo(),并利用了c ++可变参数模板功能。现在,这些实现之间的区别是什么:

template <typename... Args>
void foo(Args... args) {
whatever(args...);
}

template<typename... Args>
void foo(Args&... args) {
whatever(args...);
}

template<typename... Args>
void foo(Args... args) {
whatever(&args...);
}

template<typename... Args>
void foo(Args&&... args) {
whatever(std::forward<Args>(args)...);
}

2 个答案:

答案 0 :(得分:2)

第一个通过值获取其参数。第二个通过左值引用获取其参数(因此不能使用非const rvalues)。第三个也通过值获取其参数,但是将指针传递给whatever。第四个通过转发引用来获取其参数,并将它们完美地转发到whatever

可变参数模板没有什么神奇之处;规则和只有一个参数一样。

答案 1 :(得分:2)

template <typename... Args>
void foo(Args... args) {
    whatever(args...);
}

foo获取args副本,并将其作为l值传递给whatever

template<typename... Args> 
void foo(Args&... args) {
     whatever(args...);
}

foo获取args的l值引用,并将其作为l值传递给whatever

template<typename... Args>
void foo(Args... args) {
    whatever(&args...);
}

foo获取args副本,并将其作为指向l值的指针传递给whatever。在这里要小心对象的生命周期。

template<typename... Args>
void foo(Args&&... args) {
    whatever(std::forward<Args>(args)...);
}

foo获取转发args的引用。它们是l值还是r值取决于呼叫站点发生的情况。然后将它们完美地转发到whatever,保留它们的引用类型。斯科特迈耶斯最初称这些&#34;通用&#34;引用,但转发引用现在是首选术语。