n2439背后的原理是什么:







假设某些类A具有一些昂贵的引用计数语义,我将编写类似这样的内容,以便能够避免保留/释放临时对象:

struct B {
  A a;
  B (const& A a) & : a(retain(a)) {}
  B (const& A a) && : a(a) {}

  ~B () & { release(a); }
  ~B () && { }

  void do_something_with_a();
};

A a = getA();
auto b = B(a); // retain+released
b.do_something_with_a();
B(getA()).do_something_with_a();  // no retain / release

最佳答案

像这样的侵入式引用计数已经有20多年的历史了。它存在于COM和Objective-c这样的不可思议的地方。

在他们的时代,这些技术很有用,并帮助我们向前发展(以及向后退了几步),但是事情一直在发展。我们变得更加明智。

如今,我们了解到,将生命周期的关注点与功能分离是一种更明智的选择。它允许概念的分离,更容易理解的更简洁的代码。

这就是为什么该标准具有std::unique_ptrstd::shared_ptr的原因...

...但没有std::intrusive_basestd::intrusive_ptr

因为这些概念实际上是有害的。

重置我们的内部代码编写指导系统,以便我们编写完全解耦的代码后,我们发现我们不需要以这种方式优化构造函数-如果我们要引用A,则只需引用A,如果我们想要A向其复制shared_ptr,我们只需复制shared_ptr即可。

代码按照其提示进行操作。没有隐藏的魔法。突然,可以对带有引用计数对象的代码进行推理,我们不必记住是否需要释放对象。

欢迎来到发布c++ 11的世界。太好了:-)

关于c++ - n2439对非静态成员函数的 “Extending move semantics to *this”限制的基本原理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34421126/

10-14 18:36
查看更多