Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用类的引用或唯一指针成员是件坏事?_C++_Shared Ptr_Smart Pointers_Unique Ptr_Auto Ptr - Fatal编程技术网

C++ 为什么使用类的引用或唯一指针成员是件坏事?

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成员几乎总是错误的)。” 很明显,为什么使用引用作为成员不是一个好主意(这个问题的答案在这篇

Herb Sutter和Andrei Alexandrescu在《C++编码标准.101规则、指南和最佳实践》一书的第52条中,最后一句话是:

“在极少数情况下,具有奇怪类型成员的类(例如。, 引用(std::auto_ptrs)是一个例外,因为它们具有 特殊的复制语义。在包含引用或 auto_ptr,您可能需要编写复制构造函数和 赋值运算符,但默认析构函数已正确执行 事情 (请注意,使用引用或自动ptr成员几乎总是错误的)。

很明显,为什么使用引用作为成员不是一个好主意(这个问题的答案在这篇文章中:)

关于现代C++,它是否也意味着使用UNQuYY-PTR作为类成员通常是一件坏事?或者这仅仅是一个auto_ptr和缺少移动语义的问题
  • 那么,共享ptr应该用于多态行为吗
  • 提前谢谢

    关于现代C++,它是否也意味着使用UNQuyY-PTR作为类成员通常是一件坏事? 这并不意味着这一点,使用唯一指针也不是一件坏事

    或者这仅仅是一个auto_ptr和缺少移动语义的问题

    主要问题是复制
    auto_ptr
    会转移指向资源的所有权。这就是作者所说的“独特的复制语义”

    鉴于常量
    auto_ptr
    无法复制,因此它几乎没有非常量的危险。在C++11之前,它有一些特殊的用途,但不可复制类型的用途非常有限

    唯一指针没有特殊的复制语义。事实上,唯一指针根本不可复制。在C++11中,类型可以移动,这并不是什么大问题。独特的指针涵盖了
    auto_ptr
    可用的所有用例,以及
    auto_ptr
    危险的其他用例

  • 那么,共享ptr应该用于多态行为吗
  • 可以使用共享指针,但不是必需的

    p.S.
    auto_ptr
    在C++11中被弃用,并在C++17中完全从标准库中删除

    关于现代C++,它是否也意味着使用UNQuyY-PTR作为类成员通常是一件坏事? 这并不意味着这一点,使用唯一指针也不是一件坏事

    或者这仅仅是一个auto_ptr和缺少移动语义的问题

    主要问题是复制
    auto_ptr
    会转移指向资源的所有权。这就是作者所说的“独特的复制语义”

    鉴于常量
    auto_ptr
    无法复制,因此它几乎没有非常量的危险。在C++11之前,它有一些特殊的用途,但不可复制类型的用途非常有限

    唯一指针没有特殊的复制语义。事实上,唯一指针根本不可复制。在C++11中,类型可以移动,这并不是什么大问题。独特的指针涵盖了
    auto_ptr
    可用的所有用例,以及
    auto_ptr
    危险的其他用例

  • 那么,共享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>相反