[英]Do I have to use std::forward when passing arguments pack to another variadic template function
如何實現將參數包傳遞給函數(欄)的函數(foo),該函數最終將參數包傳遞給類構造函數? 這是代碼:
template <typename... Args>
void bar(Args&&... args)
{
MyObj obj(std::forward<Args>(args)...);
/* Do something with obj */
}
我是否必須將foo實現為
template <typename... Args>
void foo(Args&&... args)
{ bar(args...); }
要么
template <typename... Args>
void foo(Args&&... args)
{ bar(std::forward<Args>(args)...); }
您需要使用forward
。 forward
看起來像這樣:
template <class T>
constexpr T&& forward(typename std::remove_reference<T>::type& t) noexcept
{
return static_cast<T&&>(t);
}
( forward
另一個重載,但在這里是無關緊要的。)
對於模板參數包Args
每個元素Arg
, Arg
可以是:( T
是非引用類型)
T&
如果參數是非常量左值,則參數為T&
類型; 要么
const T&
如果參數是const左值),則參數為const T&
類型; 要么
T
如果參數是一個rvalue,使得參數的類型的T&&
。
在第一種情況下, forward<Arg>(arg)
實例化為:
constexpr T& forward(T& t) noexcept
{
return static_cast<T&>(t);
}
導致傳遞非常量左值。
在第二種情況下, forward<Arg>(arg)
實例化為:
constexpr const T& forward(const T& t) noexcept
{
return static_cast<const T&>(t);
}
導致要傳遞一個常量左值。
在最后一種情況下, forward<Arg>(arg)
實例化為:
constexpr T&& forward(T&& t) noexcept
{
return static_cast<T&&>(t);
}
導致傳遞右值。
在所有這三種情況下,值類別都會保留,並且值會修改為bar
而轉發。
如果不使用forward
,則將無條件傳遞一個左值,這是不希望的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.