假设我有一个函数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)...);
}
答案 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;引用,但转发引用现在是首选术语。