увеличьте диапазон итератора и отфильтруйте исключение итератора с помощью MSVC

#c #visual-studio #boost

Вопрос:

используя MSVC 2019 в режиме отладки, я получаю исключение утверждения «невозможно сравнить несовместимые итераторы string_view для равенства». Использование MSVC в режиме выпуска и Clang/G все прошло нормально (даже тестовый сайт), как и ожидалось:

     #include <boost/iterator/filter_iterator.hpp>
    #include <boost/range/iterator_range.hpp>
    #include <boost/range/iterator_range_core.hpp>
    #include <boost/range/iterator_range_io.hpp>
    #include <string_view>
    #include <iostream>

    template <typename RangeType>
    static auto filter_range(RangeType constamp; range)
    {
        struct separator_predicate {
            bool operator()(char x) { return '_' != x; }
        };

        // FixMe: MSVC 2019 with '_CONTAINER_DEBUG_LEVEL > 0' triggers
        // assertion:
        // "cannot compare incompatible string_view iterators for equality"
        return boost::make_iterator_range(
            boost::make_filter_iterator(
                separator_predicate{}, range.begin(), range.end()),
            boost::make_filter_iterator(
                separator_predicate{}, range.end()));
    }

    using iterator_type = std::basic_string_view<char>::const_iterator;
    using string_span = boost::iterator_range<iterator_type>;


    int main()
    {
        // input
        std::string_view const sv = "Hello_World";

        // algorithm get boost::iterator_range, aka string_span
        auto const range = string_span(sv);

        // here we are
        auto const range_f = filter_range(range);
        std::cout << range_f << 'n';
    }
 

Окружающая среда-это:

  • Повышение: 1,76
  • Visual Studio 2019 16.10.3 в режиме C 17
  • Windows 10

Как его можно изменить на «переносимый» для современного компилятора C 17 MSVC/Clang/G ? В чем причина этого? Использование range.data() size или data.front() size, например, для конечного итератора не компилировалось. Даже использование локальных временных переменных для начала и конца (даже это ничего не изменит, так как boost::make_iterator_range берет копию итераторов).

Заранее спасибо!