簡體   English   中英

C ++迭代器作為lambda函數中的參數,斷言失敗:“向量迭代器不兼容”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM