问题描述
在调试模式下使用 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 const& 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
- C++17 模式下的 Visual Studio 2019 16.10.3
- Windows 10
对于最新的 C++17 MSVC/Clang/G++ 编译器,如何将其更改为“可移植”?背后的原因是什么?使用 range.data() + size 或 data.front() + size 例如结尾 迭代器没有编译。即使在开始和结束时使用局部临时变量(即使它不会改变某些东西,因为 boost::make_iterator_range 需要一个迭代器的副本)。
提前致谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)