私自身は最近C++ 11、より多くのを使用して、どこで私は過去にイテレータを使用されていたであろう見つけ、私は今range-based for loops可能な限りを使用しています:基本型を反復処理するときにconst参照を使用することの欠点はありますか?
std::vector<int> coll(10);
std::generate(coll.begin(), coll.end(), []() { return rand(); });
C++ 03:
for (std::vector<int>::const_iterator it = coll.begin(); it != coll.end(); ++it) {
foo_func(*it);
}
C++ 11:
for (auto e : coll) { foo_func(e); }
しかし、どのようなコレクション要素型は、テンプレートパラメータである場合には? foo_func()
はおそらく値でconst参照することで、複雑な(=コピーする高価な)タイプを渡し、シンプルなものにオーバーロードされます。
foo_func(const BigType& e) { ... };
foo_func(int e) { ... };
私はC++ 03を使用していた間、私はこのくらいの考えを与えていませんスタイルコード。私は同じ方法を繰り返しますが、const_iteratorを参照解除するとconst参照が生成されるため、すべてが問題ありません。しかし、ループのためにC++ 11の範囲ベースを使用して、私は同じ動作を得るために、const参照のループ変数を使用する必要があります。
for (const auto& e : coll) { foo_func(e); }
そして、これは導入しないならば、突然私は、もはや確認されませんでしたauto
がシンプルな型の場合(参照を実装するシーンの後ろのポインタなど)、不要なアセンブリ命令。
しかし、サンプルアプリケーションをコンパイルすると、単純な型のオーバーヘッドがなく、テンプレートの範囲ベースのforループを使用する一般的な方法と思われることが確認されています。これが当てはまらない場合は、boost::call_traits::param_typeが行く方法でした。
質問:この規格には何らかの保証はありますか?
(私は問題が本当にループのためのベースのレンジに関連していないことを実現しています。const_iteratorsを使用するときにも存在だ。)
または単に... 'auto const &'. ;) – Xeo
@Xeo:イテレータが値に対する[const]参照ではなく値を生成する場合、表記法「T &&」はその値を値。 –
*イテレータの利便性に関わらず、Huh * * auto &&は常に参照になります。それが実際に値を生成する場合、それはちょうどrvalue参照になります。 (注:私はあなたのコメントを誤解しているかもしれません。) – Xeo