2017-10-26 6 views
1

イテレータを引数としてラムダ関数を呼び出した後、奇妙な動作が発生しました。アサーションに失敗した "ベクトルイテレータは互換性がありません"を生成します。アサーションは、なぜこれが起こるんさラムダ関数の引数としてC++ iteratorがアサーションに失敗しました: "ベクトルイテレータが互換性がありません"

void std::_Vector_const_iterator<_Myvec>::_Compat(const _Myiter& _Right) const { 
// test for compatible iterator pair 
    if (this->_Getcont() != _Right._Getcont()) { 
     _DEBUG_ERROR("vector iterators incompatible"); 
     _SCL_SECURE_INVALID_ARGUMENT; 
    } 
} 

質問にvector.hに上げて

std::vector<LAYOUT> Layouts; 
// fill vector... 
auto it = Layouts.begin(); 
while (it != Layouts.end()) { 
    // do something... 
    auto fn= [Layouts] (auto i) -> void { 
     while (i != Layouts.end()) { // <- ASSERTION RAISED HERE 
      // do something... 
      i++; 
     } 
    }; 
    fn(it); 
    it++; 
} 

私のコードは次のようになりますか?

答えて

4

私はここで本当の問題を見つけるのにしばらくかかりました。解決策は簡単です:Layoutsはキャプチャ句で参照として渡されませんでした。そのベクトルのコピーが最初に生成されました。次に、Layouts.end()イテレータは、ラムダ関数の引数として与えられた元のベクトルイテレータと互換性がなくなったことは明らかです。

解決策は、キャプチャ句に参照演算子(&)を追加することです。

auto fn= [&Layouts] (auto i) -> void { 
    while (i != Layouts.end()) { 
     // do something... 
     i++; 
    } 
}; 
+0

私はこれに遭遇しなければならない私は、この情報を他の開発者を支援するために、問題を私に思い出させるために記事[自己解答](https://stackoverflow.com/help/self-answer)を参照していますもう一度問題。 – bkausbk

関連する問題