【问题标题】:return const auto object -- and Qt implicit sharingreturn const auto object -- 和 Qt 隐式共享
【发布时间】:2011-10-24 15:18:01
【问题描述】:

所以知道这段代码是不合理的:

const int foo() 
{
  int n = // do computation...;
  return n;
}

因为无论如何复制时返回“const int”是什么意思?

但是对于像 Qt 容器这样具有隐式共享 (COW) 的类,这又有意义了吗?考虑:

const QList<mytype> get_list()
{
   QList<mytype> lst;
   // do stuff to fill list;
   return lst;
}

现在我可以做:

   const QList<mytype> mylst = get_list();

由于Qt对容器有隐式共享,它应该可以正常工作,因为return lst并没有真正复制列表的内容,只是增加引用计数,const确保我不能修改它(如果get_list出于某种原因想要确保它,或者需要它是const 方法本身)。我的想法在这里正确吗?

【问题讨论】:

  • @Dennis:我基本上是在问我在问题中列出的所有假设是否正确

标签: c++ qt copy-on-write


【解决方案1】:

和 const 确保我不能修改它......我的想法在这里正确吗?

我无法理解整个问题。但是,以上部分是不正确的。您从函数中返回的只是一个 const 值,它不强制接收端也是 const。所以从mylst 中删除const 是允许的,它再次变为可修改的。

/* const */ QList<mytype> mylst = get_list();  // ok! 'mylst' is modifiable

【讨论】:

  • 为什么会这样?为什么接收端不强制使用 const?
  • @zaharpopov,正如您为const int 演示的那样,可以复制到int 并进行修改。同样的规则也适用于此。如果你想让它不可修改,那么你可能必须重载它的复制构造函数和赋值运算符。
  • @zaharpopov:复制构造(在大多数情况下)采用const 引用(在这种情况下是您的const QList&lt;mytype&gt;&amp;)并创建一个新对象,该对象可以是const,也可以不是。跨度>
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 2014-11-09
  • 2012-05-29
  • 2016-08-02
  • 1970-01-01
  • 2016-11-16
  • 2011-06-05
相关资源
最近更新 更多