[英]C++ iterator as argument in lambda function, assertion failed: “vector iterators incompatible”
在使用迭代器作為參數調用lambda函數后,我遇到了一個奇怪的行為。 它產生一個斷言失敗“向量迭代器不兼容”。
我的代碼如下所示:
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++;
}
該斷言在vector.h中提出
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;
}
}
問題是為什么會這樣?
我花了一段時間在這里找到真正的問題。 解決方案很簡單: Layouts
沒有作為捕獲子句中的引用傳遞。 因此,首先生成了該向量的副本。 然后可以很清楚地了解到Layouts.end()
迭代器與lambda函數中作為參數給出的原始矢量迭代器不再兼容。
解決方案是在捕獲子句中添加引用運算符(&)。
auto fn= [&Layouts] (auto i) -> void {
while (i != Layouts.end()) {
// do something...
i++;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.