请看下面的示例代码:
我希望这段代码的输出结果应该是:
但我得到的是:
我看不出为什么会调用复制构造函数而不是移动构造函数。如果我在
为什么在这个例子中,尽管
我在Visual C++ November 2012 CTP上测试了这个例子。
我在这里找到了一个类似的问题: 复制构造函数被调用而不是移动构造函数 但我仍然无法理解为什么。
#include <iostream>
struct Foo {
Foo() { std::cout << "Default!\n"; }
Foo(const Foo& foo) { std::cout << "Copy!\n"; }
Foo(Foo&& foo) { std::cout << "Move!\n"; }
};
struct Bar {
Foo foo;
Bar() {}
Bar(Bar &that) : foo(that.foo) {}
Bar(Bar &&that) : foo(std::move(that.foo)) {}
};
Bar f() {
Bar bar;
return bar;
}
int main() {
Bar bar(f());
}
我希望这段代码的输出结果应该是:
Default!
Move!
但我得到的是:
Default!
Copy!
我看不出为什么会调用复制构造函数而不是移动构造函数。如果我在
struct Bar
的复制构造函数声明中,在Bar &that
前面加上关键字const
,就能得到正确的结果。我知道对于许多情况来说,使用const左值引用比只使用左值引用更好,但我只想知道为什么会发生这种情况。为什么在这个例子中,尽管
f()
的返回值应该被视为prvalue,但Bar &
优先于Bar &&
?为什么关键字const
解决了这个问题?const
确实解决了问题吗?这与RVO(返回值优化)有关吗?还是这只是编译器的bug?我在Visual C++ November 2012 CTP上测试了这个例子。
我在这里找到了一个类似的问题: 复制构造函数被调用而不是移动构造函数 但我仍然无法理解为什么。
有人可以帮我吗?
f
中,从本地变量bar
到f
的返回值有一个移动操作,而在主函数中,从构造函数参数到bar
也有一个移动操作。 - Kerrek SB