2016-06-10 108 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

對於可變參數模板沒有什麼不可思議的;規則與只有一個參數一樣。