2016-07-16 11 views
4

X&& x = static_cast<X&&>(obj_x);のようなものは、外見にもかかわらず、xは通常の左辺値の参照になります。私は最近、this articleに遭遇しました。スコットマイヤーズは、xがタイプ値参照の左辺値になると主張しています。これは本当に意味があるのですか、それとも違いなしの区別ですか?具体的には、与えられたいずれかのC++では、変数にrvalue型の参照があると言っても意味がありますか?

X&& x = static_cast<X&&>(obj_x) 

または

X& x = obj_x; 

xのこれら二つの定義のために異なる振る舞いをします、後続のコードがありますか?

+1

'decltype(x)'。 'x'が非静的なデータメンバである場合、コピーコンストラクタの生成にも影響します。 – cpplearner

+0

このコメントを回答にしてみませんか? – Ari

答えて

1

重要な違いは、R値の参照が名前付きであるか名前なし(戻り値)であるかです。

ので、書かれたとして、質問に答えるために、ない、ない以降のコードは(decltype()、cpplearnerは言及として、除く)異なっxの二つの定義を扱うないだろう。参照の意味はxの定義だけで(ウェブ検索に役立つ派手な用語)にバインドできます。

名前を持つものはすべて参照することができるので、後続の参照にバインドするためにl値のように扱われます。どうして? r値参照の主な理由は、から移動できるようにするためです。あなたがそれから移動した後、それはもはや実行可能ではありません。あなたがすることができるのは、それを破壊するか、それを割り当てることだけです。物事に名前がない場合は大したことではありませんが、名前がある場合は、誤って再度使用することは簡単です。だからこそ、std :: move(mything)を呼び出す必要があります(いくつかの戻りの場合を除いて)。

ハーブ・サッターが私にこの詳細を聞かせた記事だと思いますが、残念ながら私はそれをすぐに見つけることができません。もし私が間違って言えば、それはStephan T Lavavejだったかもしれない。

関連する問題