簡體   English   中英

std :: move Vs std :: forward

[英]std::move Vs std::forward

這似乎是已經提出的最相關的問題。

什么是std :: move和std :: forward之間的區別

但每個答案都是不同的,並且適用並且說的略有不同。 所以我很困惑。

我有以下情況。

  • 將項目復制到容器中
    復制項目是C ++ 03所以我很清楚。
  • 將項目構造到容器中
    將構造項置於容器中我認為正確使用完美轉發通過兩個函數將參數轉發給emplaceBackInternal()的T的構造函數(如果我錯了,請另外說明)。
  • 將項目移動到容器中
    我的問題似乎是理解將物品移入容器。

代碼:

template<typename T>
class Container
{
    std::size_t length;
    T*          buffer;

public:
    void push_back(T const& value)
    {
         resizeIfRequired();
         pushBackInternal(value);
    }
    template<typename... Args>
    void emplace_back(Args&&... args)
    {
         resizeIfRequired();
         emplaceBackInternal(std::forward<T>(arg)...);
    }
    void push_back(T&& value)
    {
         resizeIfRequired();
         // Is this forward correct or should it be move
         moveBackInternal(std::forward<T>(value));
    }
private:
    void pushBackInternal(T const& value)
    {
         // Copy construct object into buffer;
         new (buffer + length) T(value);
         ++length;
    }
    template<typename... Args)
    void emplaceBackInternal(Args&&... args)
    {
         // Construct object into buffer using arguments;
         new (buffer + length) T(std::forward<T>(args)...);
         ++length;
    }
    void moveBackInternal(T&& value)
    {
         // Move construct object into buffer;
         // Is this forward correct or should it be move
         new (buffer + length) T(std::forward<T>(value));
         ++length;
    }
};

我在這里包括所有三個,將三個函數與前面提到的答案中提供的答案進行比較。 主要原因是moveconstruct看起來非常相似,感覺它們應該是相同的。

回答@Potatoswatter得分67

std :: forward有一個用例:轉換模板化的函數參數

根據這個定義,我應該使用std::move push_back(T&& value)moveBackInternal(T&& value)因為該值不是函數的模板參數。

回答@Howard Hinnant得分38

如果Y是左值引用,則結果將是左值表達式。 如果Y不是左值引用,則結果將是rvalue (精確的xvalue)表達式。

看來這個定義我可以使用std::movestd::forward

回答@Bo Persson得分11

std :: forward用於完全按照傳遞給函數的方式轉發參數。

似乎說std::forward是可以接受的(盡管如果我按照答案中的鏈接所有示例都使用模板化函數)。

在這種情況下:

void push_back(T&& value)
{
     resizeIfRequired();
     moveBackInternal(std::forward<T>(value));  // (1)             
     moveBackInternal(std::move(value));        // (2) 

}

std::forward<T>(value)std::move(value)在這種情況下是相同的 (在(1)(2)之間無關緊要...所以使用(2) )。

move是對xvalue的無條件轉換。 該行為您提供了一個類型為T&&的表達式,它始終是一個右值。

forward是一個有條件的演員。 如果T是左值引用類型,則產生左值。 否則(如果它不是引用類型或右值引用類型),它會產生一個右值。 在我們的例子中, T不是引用類型 - 所以我們得到一個rvalue。

無論哪種方式,我們最終都在同一點 - 我們調用moveBackInternal並將value為右值。 只需move()是一種更簡單的方法。 forward<T> 有效 ,但沒必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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