提问人:user1244932 提问时间:11/9/2023 最后编辑:user1244932 更新时间:11/9/2023 访问量:54
数据成员和常量的make_move_iterator:如何使其失败?
make_move_iterator for data member and const: how make it failed?
问:
下面是示例:
#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
答:
1赞
Weijun Zhou
#1
如果你真的想这样做,并且只想检测问题。这可以通过添加您自己的包装器来实现。const
#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_;
};
但是,我强烈反对这样做,因为它不能防止许多其他类似的常见错误,并且还会使代码对碰巧阅读您的代码的其他人更加困惑。
评论
std::move
a=std::move(b)
b
b
const
const int x = 42; std::move(x);
T
T
T