【发布时间】:2011-08-25 22:12:08
【问题描述】:
考虑以下函数:
Foo foo(Foo x)
{
return x;
}
return x 会调用复制构造函数还是移动构造函数? (让我们把 NRVO 放在一边。)
为了调查,我写了一个简单的Foo 类,它只能移动但不能复制:
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
如果在按值返回值参数时调用了移动构造函数,一切都应该没问题。但是当前的 g++ 编译器抱怨 return x 并带有以下错误消息:
error: deleted function 'Foo::Foo(const Foo&)'
如果我用return std::move(x) 替换return x,一切都很好。由此我得出结论,如果需要,必须明确地从值参数移动。 g++的行为是否符合?
【问题讨论】:
标签: c++ rvalue-reference move-semantics c++11