[英]std::move Vs std::forward
這似乎是已經提出的最相關的問題。
什么是std :: move和std :: forward之間的區別
但每個答案都是不同的,並且適用並且說的略有不同。 所以我很困惑。
我有以下情況。
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;
}
};
我在這里包括所有三個,將三個函數與前面提到的答案中提供的答案進行比較。 主要原因是move
和construct
看起來非常相似,感覺它們應該是相同的。
std :: forward有一個用例:轉換模板化的函數參數
根據這個定義,我應該使用std::move
push_back(T&& value)
和moveBackInternal(T&& value)
因為該值不是函數的模板參數。
如果Y是左值引用,則結果將是左值表達式。 如果Y不是左值引用,則結果將是rvalue (精確的xvalue)表達式。
看來這個定義我可以使用std::move
或std::forward
。
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.