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_ptr
和std::shared_ptr
的原因...
...但没有std::intrusive_base
或std::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/