for (auto &uptr : vector_of_unique_ptrs)
「uptr」は、作成したすべてのタイプのunique_ptrへの参照になりました。 'uptr'はこの場合イテレータではありません。したがって、実際にはイテレータを邪魔しないので、コードは安全です。今
、あなたがこのようなコード書いていた場合:別の話だろう
for(auto iter = vec.begin(); iter != vec.end(); iter++)
を。ループの途中でこの 'iter'でstd :: moveを使用すると問題が発生し、おそらくあなたが望むものではないでしょう。しかし、あなたのコードを使用することは、ベクトルとループに関する限り安全です。実際には、あなたのコードを見るためにいくつかの他の方法があります:
//I'm calling your vector_of_unique_ptrs 'vec' for brevity
//and I'm assuming unique_ptr<int> just 'cause
//This works
for (auto iter = vec.begin(); iter != vec.end(); iter++) {
unique_ptr<int>& uptr = *iter;
auto result = do_the_job_with_pointee(uptr.get());
record_intermidiate_result(result, std::move(uptr));
}
//As does this
for (size_t i = 0; i < vec.size(); i++) {
unique_ptr<int>& uptr = vec[i];
auto result = do_the_job_with_pointee(uptr.get());
record_intermidiate_result(result, std::move(uptr));
}
これは、範囲ベースのforループの処理です。イテレータを使用し、それを逆参照するので、イテレータに実際に触れることはありません。
あなたのベクターには 'nullptr'' unique_ptr'があります。 – Jarod42
あなたはベクトルイテレータを無効にしてはいけません。つまり、 'erase()' 'insert()'などを呼び出すべきです。 – Slava
はい、今すぐ取得します。コメントしてくださってありがとうございます。 – AlexDenisov