假设我有一个函数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)...);
}发布于 2016-06-10 22:12:44
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,保留它们的引用类型。Scott最初将这些引用称为“通用”引用,但现在首选的术语是转发引用。
发布于 2016-06-10 22:11:09
第一种观点是以价值为依据的。第二个参数由lvalue引用(因此不能使用非constrvalue)。第三个参数也以值表示,但将指针传递给whatever。第四种方法是通过转发引用来获取它的参数,并将它们完美地转发到whatever。
变量模板没有什么神奇之处;规则是一样的,好像只有一个参数。
https://stackoverflow.com/questions/37757739
复制相似问题