微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 MSVC 提升迭代器范围并过滤迭代器异常

如何解决使用 MSVC 提升迭代器范围并过滤迭代器异常

在调试模式下使用 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 举报,一经查实,本站将立刻删除。