【问题标题】:Is it legal to return by value an object with a deleted copy constructor?按值返回具有已删除复制构造函数的对象是否合法?
【发布时间】:2015-09-30 04:21:34
【问题描述】:

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

【问题讨论】:

标签: c++


【解决方案1】:

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

以下程序适合我。

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

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

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

【讨论】:

  • @xiver77 是的。
  • @xiver77 如果禁用复制省略,编译器必须拒绝任何无法编译的程序
  • 我知道这是一个老问题,但你能解释一下为什么这是合法的吗?
  • @chessprogrammer,我无法在标准中分离出使其合法的特定段落/句子。我怀疑它在12.8 Copying and moving class objects 的某个地方。
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2022-01-03
  • 2020-08-17
  • 2016-06-14
相关资源
最近更新 更多