我正在尝试理解移动语义,因此我进行了以下测试:
#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
的移动构造函数是隐式的,但它只会复制基础数组,而不会进行其他操作。 - David G