以下代码片段导致了复制构造函数被调用,而我原本期望的是移动构造函数被调用:
在VS11 Beta中,调试模式下,这将打印:
我查看了标准,
对于这里发生的情况有什么指示吗?这是标准行为吗?
#include <cstdio>
struct Foo
{
Foo() { puts("Foo gets built!"); }
Foo(const Foo& foo) { puts("Foo gets copied!"); }
Foo(Foo&& foo) { puts("Foo gets moved!"); }
};
struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }
在VS11 Beta中,调试模式下,这将打印:
Foo gets built!
Foo gets copied!
Foo gets copied!
我查看了标准,
Bar
似乎满足所有要求,可以自动生成默认的移动构造函数,但是除非有其他原因导致对象无法移动,否则似乎不会自动生成。我在这里看到了很多与移动和复制构造函数相关的问题,但我认为没有人遇到过这个特定的问题。对于这里发生的情况有什么指示吗?这是标准行为吗?
return std::move(bar);
会改变什么吗?顺便说一下,gcc 4.7.0 调用移动构造函数(关闭复制省略)。 - Jesse Good