これは、ほとんどのrelavant質問が既に尋ねられているようです。std :: move Vs std :: forward
Whats the difference between std::move and std::forward
しかし、それぞれの答えは異なっており、適用されると若干異なる事を言います。だから私は混乱している。
私は次のような状況があります。コンテナ
に
- コピーのアイテムはコピー項目はので、私はその非常によく理解してC++ 03です。コンテナ
へ - 構築物の項目は、私は信じているコンテナへの構築物の項目は、(私が間違っている場合はそう言って下さい)
emplaceBackInternal()
にTのコンストラクタへの2つの関数を使って引数を転送するために正しく完璧な転送を使用しています。 - アイテムをコンテナに移動する
アイテムがコンテナに移動することを理解しているようです。
コード:
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;
}
};
私は、前述の答えで提供さ答えを3つの機能を比較するために、ここに3つのすべてが含まれます。主な理由は、move
とconstruct
が同じように見えて、同じである必要があるように感じるということです。
Answer @Potatoswatter Score 67
のstd ::前方には、単一のユースケースがあります。この定義によると
テンプレート関数のパラメータをキャストするために、私のようにstd::move
moveBackInternal(T&& value)
push_back(T&& value)
の内側と を使用する必要があります値は関数のテンプレートパラメータではありません。
Answer @Howard Hinnant Score 38
Yは左辺値参照である場合、結果は左辺値式となります。 Yが左辺値のリファレンスでない場合、結果は右辺値(正確なxvalue)式になります。
は、この定義によって、私はstd::move
またはstd::forward
のいずれかを使用することができるようです。
のstd ::前方には、パラメータにそれが関数に渡された正確な方法を転送するために使用されます。
回答はリンクに従うとテンプレート化された関数がすべて使用されますが、std::forward
は受け入れ可能です。この場合
...リンクされた回答によって答えられなかったあなたの質問は何ですか? – Barry
まあまあ...答えは正しい!それぞれが異なる結果を指定します。 –
彼らはすべて正しいです。 2つはちょうど 'std :: forward'の目的は転送参照のためであり、第3は' std :: forward'が何であるかを説明する時間を費やしています。 – Barry