[解決済み] 範囲ベースのforループで転送参照を使用する利点は何ですか?
質問
const auto&
は、私が読み取り専用の操作を実行したい場合、十分である。しかし、私は
for (auto&& e : v) // v is non-const
を最近何度か使っています。これを見ると、不思議な気持ちになります。
いくつかの不明瞭なコーナーケースにおいて、転送参照を使用することでパフォーマンス上の利点がある可能性があります。
auto&
または
const auto&
?
(
shared_ptr
は、不明瞭なコーナーケースのための容疑者です)
更新 お気に入りで見つけた2つの例。
基本的な型を反復するときに const 参照を使用することの不利な点はありますか?
範囲ベースのforループを使用して、マップの値を簡単に反復処理することはできますか?
質問に集中してください。 なぜ範囲ベースのforループでauto&&を使用したいのでしょうか?
どのように解決するのですか?
唯一の利点は、シーケンスイテレータがプロキシ参照を返し、その参照に対して非恒等式に操作する必要がある場合です。 例えば考えてみましょう。
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}
これはコンパイルされません。
vector<bool>::reference
から返される
iterator
から返される
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto&& e : v)
e = true;
}
とはいえ、このようなユースケースを満たす必要があるとわかっていない限り、私ならこのようなコーディングはしないでしょう。 つまり、私なら、この方法が は というのは、あなたが何をしようとしているのか、人々に疑問を抱かせるからです。 そして、もしそうするのであれば、その理由についてのコメントを入れても問題はないでしょう。
#include <vector>
int main()
{
std::vector<bool> v(10);
// using auto&& so that I can handle the rvalue reference
// returned for the vector<bool> case
for (auto&& e : v)
e = true;
}
編集
私のこの最後のケースは、本当に意味をなすためにテンプレートであるべきです。 もしループが常にプロキシ参照を扱っていることが分かっているのであれば
auto
と同じように動作するでしょう。
auto&&
. しかし、ループがプロキシでない参照を処理することもあれば、プロキシ参照を処理することもある場合、私が思うに
auto&&
が最適な解決策になると思います。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。
-
[解決済み] ( for... in ) と ( for... of ) の文の違いは何ですか?
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] std::mapで範囲指定for()ループを使用するには?
-
[解決済み] C++11逆レンジベースforループ
-
[解決済み】カスタムタイプを「範囲ベースのforループ」で動作させる方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない