【发布时间】:2015-03-11 14:05:59
【问题描述】:
我正在尝试理解移动语义,所以我做了以下测试:
#include <iostream>
#include <array>
using namespace std;
void tryToMove(array<double,3> && v) {
array<double,3> v_ = std::move(v);
std::cout << v_[0] << " " << v_[1] << " " << v_[2] <<'\n';
}
int main () {
array<double,3> v{1,2,3};
tryToMove(std::move(v));
std::cout << v[0] << " " << v[1] << " " << v[2] <<'\n';
}
我预计主的 std::cout 中会出现分段错误,因为 v_ 应该移动到 tryToMove 中。但是,输出是:
1 2 3
1 2 3
这里到底发生了什么?
谢谢!
【问题讨论】:
-
移动语义与分段错误有什么关系?你期待未定义的行为吗?如果是这样,未定义的行为不是“将始终崩溃”的代码。
-
当您在某个对象上调用
std::move时,您必须假设它已被成功移出。该标准表示对象在移动后处于有效但未指定的状态,因此数组中的值不是确定性的。std::array的移动构造函数是隐式的,因此它只会复制底层数组,仅此而已。
标签: c++ c++11 move-semantics