0

最近、私は移動セマンティクスを理解しようとしていて、質問がありました。std :: forward実装の違い

質問は既に説明済みですhere

Iは第一の変形を実施して、L値又はR値を返すかどうかをチェック:

#include <iostream> 
using namespace std; 

template <typename T> 
T&& my_forward(T&& x) { 
    return static_cast<T&&> (x); 
} 

int main() { 
    int a = 5; 
    &my_forward(a); // l-value 
    return 0; 
} 

IのL値を渡す場合、私が取ることができるので、それで、それは、コンパイル(L値を返しますL値からアドレス)と私はそれを行う場合:my_forwardはr値を返したため

&my_forward(int(5)); // r-value with int&& type 

私のコードは、コンパイルされません。上記の質問では、この実装と標準的な実装(std :: remove_referenceと2つの異なる引数はそれぞれ&と& &)との違いは、私の実装が常にl-valueを返すことですが、 r値とl値の両方を返します。

私はstd :: forwardをそのように実装できないのでしょうか?どのような特定のケースでは、それはstandartの違いを示しますか?また、Tをテンプレートとして指定する必要があり、引数型でそれ自体を定義させることができないのはなぜですか?

+0

は、なぜあなたは右辺値参照のアドレスを取得しようとしていますか? – xinaiz

+0

@BlackMoses r値をチェックします。 – LogicStuff

+0

@LogicStuffああ、大丈夫、 '&'使い方の誤解だと思った: – xinaiz

答えて

3

実際の状況でstdのようにしてみてください。あなたのものは動作しません。

void test(std::vector<int>&&){} 

template<class T> 
void foo(T&&t){ 
    test(my_forward<T>(t)); 
} 

foo(std::vector<int>{}); 

上記はコンパイルされません。それはstd::forwardで行います。

あなたのフォワードは、ブロック参照生涯の延長以外は役に立たない。一方、std::forwardは条件付きstd::moveです。

名前が付いているものはすべて左辺値ですが、前方には名前付きの右辺値参照が移動します。

名前の付いた値の参照は左辺値です。

+0

ありがとう!私はこの[コード](http://ideone.com/XPePam)でチェックしたところ、間違っていたようだ。私は実際の状況でそれをチェックしませんでした。なぜなら、私は(teoretically)それらの実装が同じであると思ったからです。私は本当に違いが何かを理解できません。あなたはそれを説明できますか? – fminkin

+0

そして、なぜ私の実装はこのように動作しますか?私たちがトピックで見たように、それはr値を返します、なぜそれはそれで動作しませんか? – fminkin

+0

**名前付きの値の参照は左辺値です**あなたは混乱し続けることを理解するまで、 – Yakk

1

それが値カテゴリの間違った種類を調べるため、残念ながら、アドレスを服用すると、あなたの状況において有用操作ではありません。

  • あなたがglvalueのではなく、prvalueのアドレスを取ることができます。 glvalueは「位置」(すなわち、オブジェクトがどこにあるか)を表し、prvalueは「初期化」(すなわち、オブジェクトがどの値を有するか)を表す。

  • 右辺値からリソースを盗むことはできますが、左辺値からは盗むことはできません。左辺値参照は右辺値にバインドされ、左辺値参照は右辺値にバインドされます。 std::forwardのポイントは、rvalueが与えられたときにrvalueに引数をキャストし、lvalueが与えられたときにlvalueに引数をキャストすることです。

std::forwardは右辺値を返すとき、それは実際にはxValueを返し、xvaluesは右辺値とglvaluesの両方である:

    lvalue  f() for "T& f();", decltype(f()) is T& 
       /
      glvalue 
     /  \ 
    value    xvalue  f() for "T&& f();", decltype(f()) is T&& 
     \  /
      rvalue 
        \ 
        prvalue  f() for "T f();", decltype(f()) is T 
+0

私はあなたが意味すると思う。 "あなたは左辺値からではなく、右辺値からリソースを盗むことができます。" – Lenz

+0

@Lenz:感謝しました:-) –

関連する問題