我正在研究移动构造函数和移动赋值操作,并遇到了这个问题。首先是代码:
#include <iostream>
#include <utility>
class Foo {
public:
Foo() {}
Foo(Foo&& other) {
value = std::move(other.value);
other.value = 1; //since it's int!
}
int value;
private:
Foo(const Foo& other);
};
void Bar(Foo&& x) {
std::cout << "# " << x.value << std::endl;
}
int main() {
Foo foo;
foo.value = 5;
Bar(std::move(foo));
std::cout << foo.value << std::endl;
return 0;
}
依我之见,当我使用:
Bar(std::move(foo));
在Bar函数中,程序应该使用移动构造函数将foo对象“移动”到创建的临时对象temp中。这样做会使foo对象的值等于零。不幸的是,似乎Bar函数中作为参数的对象是某种引用,因为它没有“移动”原始值,但使用Bar的参数可以更改它。
请问有人能向我解释一下为什么我在控制台上看到:
#5
5
而不是
#5
0 //this should be done by move constructor?
void Bar(Foo x);
,进行比较可能会更有教育意义。请注意保持内容准确无误,同时使其易于理解。 - ascheplerBar(Foo&& x)
,那么在Bar
函数内部,它 完全相同 于函数是Bar(Foo& x)
。唯一的区别在于,在调用函数时可以绑定哪些类型的对象/引用。 - M.M