按值返回带有已删除副本构造函数的对象是否合法?

时间:2015-09-29 20:11:28

标签: c++

通过值返回具有已删除的复制构造函数的对象是否合法?例如,考虑具有std::unique_ptr成员的对象。大多数编译器在按值返回这些对象时不会抱怨,因为在大多数情况下,编译器甚至不会查找复制构造函数。但是,由于标准不要求(N)RVO,是否可以说这些程序是合法的?在这些情况下,标准合规性需要返回声明中的std::move吗?

1 个答案:

答案 0 :(得分:4)

如果你有一个工作移动构造函数,你可以删除复制构造函数。

以下程序适合我。

struct Foo
{
   Foo() = default;
   Foo(Foo const&) = delete;
   Foo(Foo&&) = default;
};

Foo test()
{
   Foo f;
   return f;
}

int main()
{
   Foo f = test();
   return 0;
}