6

BOOST_FOREACHを範囲ベースのforループに置き換えるプロセスを経験したことがありますか? 機械的に行う場合(つまり、コードの詳細な調査を行わない場合) に落とし穴はありますか?

背景: Microsoft VC++ 10 (Visual Studio 2010) でコンパイルされた約 250K 行のソースがあります。コードは、boost ライブラリの BOOST_FOREACH も使用します。を使用した範囲ベースのforループも実装する VC++ 11 (Visual Studio 2012 RC) を試していautoます。

これまでのところ、要素が外で宣言されている状況に遭遇しましたBOOST_FOREACH(括弧内に宣言はありません):

BOOST_FOREACH (element, container) {
    ...
}

...そして、 のelement後のループで値が設定されることが期待されていましたbreak同様の問題を覚えていますか?

BOOST_FOREACHに宣言が含まれている場合、明示的な型を で置き換えることを選択しますかauto? BOOST_FOREACH明示的な宣言をそこに残すのではなく、機械的に書き換えるだけの場合、そうする利点はありますか?

助けてくれてありがとう、ペトル

4

2 に答える 2

4

実際の型または参照型を使用する利点はauto、コンテナーの型が変更されてもコードが引き続き機能することです。コンテナ イテレータを間接化した結果に対して意図的に型変換を実行している場合、これは望ましくない可能性があります。

例:

std::vector<int> v;
for (int i: v) ...

またはvへの変更の場合、型変換は望ましくない可能性があります。それでも、コンパイラの警告はこれをキャッチする必要があります (特に縮小変換の場合)。一方、(拡大) 変換が意図されているコードを使用することもできます。std::vector<long>std::vector<unsigned>

std::vector<char> v;
for (int i: v) ...
于 2012-08-24T15:21:07.460 に答える
1

明示的な型を auto に置き換えることを選択しますか?

はい。ただし、型が eg の場合は、int&それを置き換えauto&ます。そうでない場合、推定された型は参照になりません。

于 2012-08-24T13:18:31.067 に答える