N2439 非静态成员函数"Extending move semantics to *this"限制背后的基本原理

n2439 rationale behind "Extending move semantics to *this" limitations to non static member functions

本文关键字:背后 this 函数 静态成员 Extending move to semantics N2439      更新时间:2023-10-16

n2439:背后的原理是什么

12.1.4不得使用ref限定符来声明构造函数。

12.4.2析构函数不得使用ref限定符进行声明。

假设某个类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。。。

而没有CCD_ 3或CCD_。

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

重置了我们的内部代码编写指导系统,以便编写良好的解耦代码后,我们发现我们不需要以这种方式优化构造函数——如果我们想要引用a,我们只需引用a,如果我们想要shared_ptr的副本,我们只需要复制shared_ptr

代码按照锡上的指示执行。没有隐藏的魔法。突然之间,具有引用计数对象的代码就可以推理了,我们不必记住是否需要释放对象。

欢迎来到后c++11世界。太棒了:-)