我正在努力更好地理解C++中的移动方式。编译器如何知道何时进行移动操作,何时不进行移动操作?
#include <iostream>
template <typename T>
struct Container {
T value;
Container (T value): value(value) {}
Container (const Container & i): value(i.value) {
std::cout << "copying" << std::endl;
}
Container (Container && i): value(std::move(i.value)) {
std::cout << "moving" << std::endl;
}
};
void increment (Container<int> n) {
std::cout << "incremented to " << ++n.value << std::endl;
}
int main () {
Container<int> n (5);
increment(std::move(n));
std::cout << n.value << std::endl;
}
这个例子打印输出。
moving
incremented to 6
5
我期望int
已经被移动,但之后我不应该能够继续使用它(并获得原始值)。
好的,也许int
被复制了,因为value(std::move(i.value))
在移动构造函数中复制了它。但我仍然不理解为什么Container<int> n
在明确被移动之后还存在。
int
已经被移动了,但之后我不应该还能继续使用它。为什么不能呢?编译器应该用垃圾数据来清除它,以及每个其他被std::move
的基本类型,只是为了符合您错误的移动语义定义吗?那将代表一种反优化。移动存在是为了实现资源的最佳传输。按照定义,基本类型没有任何资源。 - underscore_d