2016-06-10 122 views
1

说我有一个函数foo()与利用C++ variadic模板功能。现在,这些实现有什么区别:Variadic模板参数前进

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
template <typename... Args> 
void foo(Args... args) { 
    whatever(args...); 
} 

foo得到拷贝args,并将它们传递到whatever如1-值。

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

foo得到1-值引用args并将它们传递给whatever如1-值。

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

foo得到拷贝args,并将它们传递到whatever作为指针指向1-值。在这里小心物体的寿命。

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

foo得到转发引用args。它们是否为l值或r值取决于呼叫站点发生的情况。他们然后完美 - 转发到whatever,保留其参考类型。斯科特迈尔斯最初称这些“通用”参考,但转发参考是现在的首选术语。

2

第一个按值取其参数。第二个参数通过左值引用(因此无法使用非const右值)。第三个也通过价值取其参数,但通过指向whatever。第四个是通过转发参考的参数并将其完美转发到whatever

对于可变参数模板没有什么不可思议的;规则与只有一个参数一样。