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