说我有一个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)...);
}
template <typename... Args>
void foo(Args... args) {
whatever(args...);
}
foo
得到拷贝的args
,并将它们传递到whatever
作为左值。
template<typename... Args>
void foo(Args&... args) {
whatever(args...);
}
foo
获取L值引用args
并将其whatever
作为L值传递给。
template<typename... Args>
void foo(Args... args) {
whatever(&args...);
}
foo
得到拷贝的args
,并将它们传递到whatever
作为指针指向左值。在这里要注意对象的生命周期。
template<typename... Args>
void foo(Args&&... args) {
whatever(std::forward<Args>(args)...);
}
foo
获取对的转发引用args
。它们是左值还是右值取决于呼叫站点发生的情况。然后将它们完美地转发到whatever
,以保留其引用类型。斯科特·迈耶斯(Scott Meyers)最初将这些称为“通用”引用,但现在转发引用是首选的术语。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句