visual c ++为什么std :: move crash

时间:2018-01-22 11:56:00

标签: c++ c++11 visual-c++ stdvector

我想在另一个向量的末尾追加一个向量。根据我的知识,函数std::move()是选择的函数"为了这个任务。为什么来自Microsoft Visual C ++ Express的std::move()在手工制作的循环按预期工作时会崩溃?

我正在使用Microsoft Visual C ++ 2015 Update 3.不幸的是,我无法使用其他编译器对此进行测试。

// The setup code for the two vectors:
vector<unique_ptr<channel>> channels, added_channels;

// ...  here is some code that adds some elements to both vectors

根据我的知识,以下两段代码应该以相同的方式工作。他们应该将added_channels的元素移到channels的末尾。

这是崩溃的第一个变种:

std::move(added_channels.begin(), added_channels.end(), channels.end());

这是第二个有效的版本:

for(auto & ref : added_channels)
{
    channels.push_back(std::move(ref));
}

2 个答案:

答案 0 :(得分:12)

std :: move移动到特定位置 如果要将其插入向量的背面,则应使用std::back_inserter

std::move(added_channels.begin(), added_channels.end(),  std::back_inserter(channels));

答案 1 :(得分:4)

这实际上是move_iterator实际上有用的少数情况之一:

channels.insert(channels.end(), 
                std::make_move_iterator(added_channels.begin()), 
                std::make_move_iterator(added_channels.end()));

要插入vector,范围insert优先于逐个元素push_back(或等效的back_inserter),因为它可以避免不必要的重新分配并正确增长存储呈指数级增长。后者容易搞乱:reserve的不加选择使用很容易导致二次行为。