c++ make_move_iterator for data member and const:make it failed?

k3fezbri  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

下面是一个例子:

#include <vector>
#include <iterator>

class Foo {
public:
  void combine(std::vector<std::vector<float>> &all_data) const {
    all_data.insert(all_data.end(), std::make_move_iterator(data_.begin()),
            std::make_move_iterator(data_.end()));
  }
private:
  std::vector<std::vector<float>> data_;
};

字符串
问题是它在没有任何警告的情况下编译,而const + std::make_move_iterator(not_volatile_data_member)在我看来应该失败。
为什么它不是编译时错误,我如何防止将来发生这样的错误?
编辑:
我想编译错误,如果数据成员(data_)的数据不能移动,我得到的是复制而不是移动,而我明确地告诉编译器,我想通过make_move_iterator移动。

6ioyuze2

6ioyuze21#

如果你真的想这么做,并且只是想检测const s的问题。它可以通过添加自己的 Package 器来实现。

#include <vector>
#include <iterator>

template <typename Iter>
decltype(auto) my_make_move_iterator(Iter&& it){
    static_assert(!std::is_const_v<std::remove_reference_t<decltype(*it)>>);
    return std::make_move_iterator(std::forward<Iter>(it));
}

class Foo {
public:
  void combine(std::vector<std::vector<float>> &all_data) const {
    all_data.insert(all_data.end(), my_make_move_iterator(data_.begin()),
            my_make_move_iterator(data_.end()));
  }
private:
  std::vector<std::vector<float>> data_;
};

字符串
然而,我强烈反对这样做,因为它不能防止许多其他类似的常见错误,而且还会让碰巧读过你的代码的人更加困惑。

相关问题