【问题标题】:Add unique_ptr as instance field of a class instead of explicitly removing copy / assignment ctors添加 unique_ptr 作为类的实例字段,而不是显式删除复制/赋值 ctors
【发布时间】:2015-05-29 15:33:18
【问题描述】:

有一些宏可以防止类被复制,例如: Macros to disallow class copy and assignment. Google -vs- Qt

仅通过在我的班级中有一个 unique_ptr 我会得到相同的结果吗?如果是这样,有理由不这样做吗?例如

class Foo {
  private:
    std::unique_ptr<int> DISABLE_COPY;
};

【问题讨论】:

    标签: c++ c++11 copy-constructor unique-ptr


    【解决方案1】:

    不允许的宏确实适用于 C++98/03。 C++11 有 = delete 运算符用于消除复制/赋值。添加unique_ptr 会使您的课程有点膨胀,但更糟糕的是,我认为这只是实现删除副本/分配的一种非常迂回且不清楚的方式。

    class Foo {
    public:
      Foo(const Foo&) = delete;
      Foo& operator=(const Foo&) = delete;
    };
    

    将非常清楚地实现这些结果。

    【讨论】:

    • 因此,内存膨胀并不重要,因为我的班级可能已经大到足以让我禁止复制/分配。我没有意识到宏不再是最好的解决方案,最重要的是——我认为意图的混淆是最大的问题。
    【解决方案2】:

    是的,添加 unique_ptr&lt;int&gt; 成员将使您的类不可复制。但这并不是最好的解决方案。您刚刚向Foo 添加了 8 个字节,如果您只是这样做,则不需要存在 8 个字节:

    class Foo {
        Foo(const Foo&) = delete;
        Foo& operator=(const Foo&) = delete;
    };
    

    此外,当您尝试意外复制时的编译错误将更加清晰。考虑最新的 gcc:

    main.cpp:17:13: error: use of deleted function 'Foo::Foo(const Foo&)'
         Foo g = f;
                 ^
    main.cpp:9:5: note: declared here
         Foo(const Foo&) = delete;
         ^
    

    相对于:

    main.cpp:17:13: error: use of deleted function 'Foo::Foo(const Foo&)'
     Foo g = f;
             ^
    main.cpp:6:8: note: 'Foo::Foo(const Foo&)' is implicitly deleted because the default definition would be ill-formed:
     struct Foo {
            ^
    main.cpp:6:8: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
    In file included from /usr/local/include/c++/5.1.0/memory:81:0,
                     from main.cpp:4:
    /usr/local/include/c++/5.1.0/bits/unique_ptr.h:356:7: note: declared here
           unique_ptr(const unique_ptr&) = delete;
           ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2016-04-02
      • 2014-06-30
      • 2013-06-18
      相关资源
      最近更新 更多