代码之家  ›  专栏  ›  技术社区  ›  Brian Bi

为什么这段包含boost::transform_迭代器的代码不能工作?

  •  2
  • Brian Bi  · 技术社区  · 6 年前

    这段代码的灵感来自几天前关于堆栈溢出的另一个问题。它尝试使用转换迭代器来构造 std::vector 包含不可移动的字体的。

    #include <cstdio>
    #include <iterator>
    #include <vector>
    
    #define BOOST_RESULT_OF_USE_DECLTYPE
    #include <boost/iterator/transform_iterator.hpp>
    
    struct NonMovable {
        NonMovable(const NonMovable&) = delete;
        void operator=(const NonMovable&) = delete;
        NonMovable(NonMovable&&) = delete;  // redundant
        void operator=(NonMovable&&) = delete;  // redundant
        NonMovable(int x, int y) : x(x), y(y) {}
        int x;
        int y;
    };
    
    int main(int argc, char* argv[])
    {
        std::vector<int> args = {1, 2, 3, 4};
        int additional_arg = 5;
        auto fun = [&additional_arg](auto arg) { return NonMovable(arg, additional_arg); };
        std::vector<NonMovable> v(boost::make_transform_iterator(args.begin(), fun),
                                  boost::make_transform_iterator(args.end(), fun));
        for (const auto& item : v) {
            printf("%d %d\n", item.x, item.y);
        }
    }
    

    https://wandbox.org/permlink/20xMUsCBUg44YmXC 标准::矢量

    no type named 'reference' in 'std::__1::iterator_traits<boost::iterators::transform_iterator<(lambda at prog.cc:22:16), std::__1::__wrap_iter<int *>, boost::iterators::use_default, boost::iterators::use_default> >'

    iterator_traits 专业化不应具有名为的成员 reference .

    0 回复  |  直到 6 年前
    推荐文章