【发布时间】:2014-08-16 15:01:35
【问题描述】:
因为std::move(v) 只是一个演员像
static_cast<T&&>(v)
其中T 是v 的类型。但是为什么移动的变量不是原始对象的reference?
例如,当o1被“移动”到o2时,为什么我们不能再访问o2到o1.str_的str_?
#include <string>
#include <iostream>
struct MyClass {
std::string str_;
MyClass(MyClass const &) = delete;
MyClass &operator=(MyClass const &) = delete;
MyClass(MyClass &&o) : str_(std::move(o.str_)) {}
MyClass(std::string const &str) : str_(str) {}
};
int main(void) {
MyClass o1 = MyClass("o1");
MyClass o2(std::move(o1));
std::cout << "o1: " << o1.str_ << "\n"
<< "o2: " << o2.str_ << std::endl;
return 0;
}
输出:
o1:
o2: o1
更新:
好像当我换了
MyClass(MyClass &&o) : str_(std::move(o.str_)) {}
到
MyClass(MyClass &&o) : str_(o.str_) {}
输出将是:
o1: o1
o2: o1
所以根本原因是“std::string”移动?但是为什么这会有所不同呢?
【问题讨论】:
-
“通过
o2访问str_到o1.str_”是什么意思? -
@WiSaGaN:OP认为
main的第二行神奇地使o2变成了变量o1。不过,这不是 C++ 的工作方式。 -
@KerrekSB 你能告诉我为什么
o1.str_不再是代码块末尾的o1吗? -
因为它已被移出。
-
回答您关于为什么移动到的变量 (
o2) 不是reference的问题:引用与移动无关,以及变量的类型(其中 includes 是否是引用)由您声明变量的内容决定(在这种情况下,o2被声明为MyClass类型),不是你如何构造它——实际上引用甚至不是真正构造的——即,没有调用构造函数来生成它们(因为它们只是内部的指针,而不是实际的对象)。
标签: c++ c++11 move rvalue-reference