簡體   English   中英

將參數包傳遞給另一個可變參數模板函數時,是否必須使用std :: forward

[英]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每個元素ArgArg可以是:( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM