C++ 为什么使用类的引用或唯一指针成员是件坏事?
Herb Sutter和Andrei Alexandrescu在《C++编码标准.101规则、指南和最佳实践》一书的第52条中,最后一句话是: “在极少数情况下,具有奇怪类型成员的类(例如。, 引用(std::auto_ptrs)是一个例外,因为它们具有 特殊的复制语义。在包含引用或 auto_ptr,您可能需要编写复制构造函数和 赋值运算符,但默认析构函数已正确执行 事情 (请注意,使用引用或自动ptr成员几乎总是错误的)。” 很明显,为什么使用引用作为成员不是一个好主意(这个问题的答案在这篇文章中:) 关于现代C++,它是否也意味着使用UNQuYY-PTR作为类成员通常是一件坏事?或者这仅仅是一个auto_ptr和缺少移动语义的问题C++ 为什么使用类的引用或唯一指针成员是件坏事?,c++,shared-ptr,smart-pointers,unique-ptr,auto-ptr,C++,Shared Ptr,Smart Pointers,Unique Ptr,Auto Ptr,Herb Sutter和Andrei Alexandrescu在《C++编码标准.101规则、指南和最佳实践》一书的第52条中,最后一句话是: “在极少数情况下,具有奇怪类型成员的类(例如。, 引用(std::auto_ptrs)是一个例外,因为它们具有 特殊的复制语义。在包含引用或 auto_ptr,您可能需要编写复制构造函数和 赋值运算符,但默认析构函数已正确执行 事情 (请注意,使用引用或自动ptr成员几乎总是错误的)。” 很明显,为什么使用引用作为成员不是一个好主意(这个问题的答案在这篇
auto_ptr
会转移指向资源的所有权。这就是作者所说的“独特的复制语义”
鉴于常量auto_ptr
无法复制,因此它几乎没有非常量的危险。在C++11之前,它有一些特殊的用途,但不可复制类型的用途非常有限
唯一指针没有特殊的复制语义。事实上,唯一指针根本不可复制。在C++11中,类型可以移动,这并不是什么大问题。独特的指针涵盖了auto_ptr
可用的所有用例,以及auto_ptr
危险的其他用例
auto_ptr
在C++11中被弃用,并在C++17中完全从标准库中删除
关于现代C++,它是否也意味着使用UNQuyY-PTR作为类成员通常是一件坏事?
这并不意味着这一点,使用唯一指针也不是一件坏事
或者这仅仅是一个auto_ptr和缺少移动语义的问题
主要问题是复制auto_ptr
会转移指向资源的所有权。这就是作者所说的“独特的复制语义”
鉴于常量auto_ptr
无法复制,因此它几乎没有非常量的危险。在C++11之前,它有一些特殊的用途,但不可复制类型的用途非常有限
唯一指针没有特殊的复制语义。事实上,唯一指针根本不可复制。在C++11中,类型可以移动,这并不是什么大问题。独特的指针涵盖了auto_ptr
可用的所有用例,以及auto_ptr
危险的其他用例
p.S.
auto_ptr
在C++11中被弃用,在C++17中被完全从标准库中删除。使用唯一的_ptr
成员不是一个坏做法,因为它所属的类是分配对象的所有者。但是,它会使包含它的类的处理变得复杂,因为它会阻止类的可复制性。因此,如果该类包含任何其他非平凡成员,则必须为该类编写移动构造函数、移动赋值运算符和析构函数
相反,我会考虑使用<代码> SysDypPTR <代码>,因为类成员是一个坏的实践,因为它并不意味着任何类型的所有权,并且在您的代码中导致不确定的对象生命周期,因为您不知道
共享的\u ptr
所持有的对象的最后一个实例何时被释放。使用唯一的\u ptr
成员并不是一种坏的做法,因为它所属的类是分配对象的所有者。但是,它会使包含它的类的处理变得复杂,因为它会阻止类的可复制性。因此,如果该类包含任何其他非平凡成员,则必须为该类编写移动构造函数、移动赋值运算符和析构函数
相反,我认为使用<代码> SydDypTr>代码>作为类成员是一个不好的实践,因为它不意味着任何类型的所有权,并且在代码中导致一个不确定的对象生命期,因为您不知道什么时候被“代码> SydDypTrp/代码>所保存的对象的最后一个实例被释放。
作为代码> UnQuyGPPT/<代码>是不可复制的,它没有奇怪的复制语义,与auto_ptr
相反。从关于auto_ptr
的建议到关于unique_ptr
的结论是一个很大的飞跃。我认为这应该理解为“除非你需要引用成员,否则不要使用引用成员”,而不是“永远不要使用引用成员”,虽然我可能会误解这句话,但我也不同意“几乎总是”这个短语的其他用法,因为“几乎总是”这个短语是一种黑客行为,它反映了对所有权如何运作的天真看法。我们从中吸取的经验教训被纳入了较新类型的共享指针中,因此关于如何使用auto_ptr
的指导原则不适用于其他任何内容。祝它安息。@PeteBecker在设计auto\u ptr
时也不存在右值引用,所以没有人会因为lib-ppl没有合适的核心语言工具而责怪它unique\u ptr
是不可复制的,它没有奇怪的复制语义,与aut>相反