N2439 非静态成员函数"Extending move semantics to *this"限制背后的基本原理
n2439 rationale behind "Extending move semantics to *this" limitations to non static member functions
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_ptr
和std::shared_ptr
。。。
而没有CCD_ 3或CCD_。
因为这些概念实际上是有害的。
重置了我们的内部代码编写指导系统,以便编写良好的解耦代码后,我们发现我们不需要以这种方式优化构造函数——如果我们想要引用a,我们只需引用a,如果我们想要shared_ptr
的副本,我们只需要复制shared_ptr
。
代码按照锡上的指示执行。没有隐藏的魔法。突然之间,具有引用计数对象的代码就可以推理了,我们不必记住是否需要释放对象。
欢迎来到后c++11世界。太棒了:-)
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- 在noexcept 规范中是否允许使用"this"?
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++调用具有 *this 属性的单个帮助程序函数
- std::背后的基本原理assignable_from可能的实现
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- QObject::连接无法将信号连接到*this*对象的插槽
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- N2439 非静态成员函数"Extending move semantics to *this"限制背后的基本原理