#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 берет копию итераторов).
Заранее спасибо!