2016-05-07 5 views
1

私は現代のC++を少し学び、コードのスタイルやものを改善しています。現代の二重参照

for (auto&& i = 0; i <= iNumber; ++i){ 
    std::cout << vecStrings[i] << std::endl; 
} 

for (auto i = 0; i <= iNumber; ++i){ 
    std::cout << vecStrings[i] << std::endl; 
} 

ここでの違いは何ですか

VS: それは基本的に二重の参照を使って何ですか?私はたくさんのものを試しましたが、それは実際には何の違いもありません。

+0

適切なGoogle検索が必要な場合は、「rvalue reference」と呼ばれます。 – kfsone

+0

"ダブルリファレンス"と呼んでいるのは正式に "レアルリファレンス"と呼ばれています。その話題にはたくさんの情報があります。 –

+0

これまでに私が遭遇した説明を理解するのが最も簡単です:https://en.wikipedia。org/wiki/C%2B%2B11#Rvalue_references_and_move_constructors – GigaRohan

答えて

1

この表記法はC++ 11で新しく追加されたもので、「移動力学」の一部です。基本的な考え方は、C++がオブジェクトを関数の引数として渡す際にオブジェクトをコピーしなければならないケースがたくさんあることを発見したことです。そのような場合の多くでは、そのコピー操作にはメモリ割り当てが必要です。たとえば、文字列をコピーする必要がある場合は、その文字列にテキストのコピーを格納するために新しいメモリブロックを作成する必要があります。

これらの問題を回避するには、言語を改善する価値があることが十分にあることがよくあります。私たちは、 "rvalue reference"の考え方を作成しました。これは、&&で終わるタイプです。 ではなく、「ダブルリファレンス」または「リファレンスへの参照」ではありません。これは単なる基準値であることを示す記号です。

rvalue参照が渡された場合、関数の呼び出し元は、通常のコピーの仕組みではなく、そのrvalueで「移動」メカニックを使用する意思があることを意味します。移動の仕組みでは、呼び出し側は基本的に「この時点でこの変数を使用するつもりはないので、それを切り詰めてデータを移動したい場合、私は気にしません」と述べています。この仕様では、明示的なユースケースも提供しています。テンポラリ変数は、 "rvalue references"として作成されるので、内容を盗み出すことができます(行の最後に割り当て解除されるだけです)

文字列をコピーする最も一般的な例を使用するには、std::string(std::string&&)コンストラクタで「rvalue reference」を受け入れます。この新しく作成された文字列は、古い文字列のデータをすぐに盗むかどうかを呼び出し元が気にしないことを知っています。したがって、このコンストラクタは単に古い文字列からデータポインタをコピーし、古い文字列のポインタをnullに設定します(または、ある文字列から別の文字列へのデータの所有権を「移動」する効果があります)。これは、文字列のコピーに新しいスペースを割り当てるよりもはるかに効率的です。私たちがちょうど古いものを割り当て解除しようとしていることがわかっているときです。

あなたの場合、少しばかげています。 intのコンテンツを切り刻むことに意味がないので、試してみるとできないと思います。これは単なる超々しい構文です。しかし、それが重要な場合があります。たとえば、あるベクトルから別のベクトルにデータを移動する関数を記述しているとします。ベクトルに "rvalue reference"を渡した場合、呼び出し元はデータをcanabalizeしても気にしません。ベクトルの要素を参照するのにauto&&を使用すると、これらの要素を別の関数に渡すことができ、呼び出し元がどちらか気にしないことを知っているので「この要素の内容を混乱させるかどうかは気にしません。 。

どちらの場合でも、構文によって許可されます。いくつかのコーナーケースでは便利な構文です(std::moveが気になります)。ほとんどの場合、それは過剰です。

関連する問題