将unique_ptr添加为类的实例字段,而不是显式删除复制/赋值ctors

时间:2015-05-29 15:33:19

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

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

只要在班上有一个unique_ptr,我会得到相同的结果吗?如果是这样,有没有理由不这样做?例如

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

是的,添加Foo成员会使您的课程无法复制。但这不是最好的解决方案。您刚刚向class Foo { Foo(const Foo&) = delete; Foo& operator=(const Foo&) = delete; }; 添加了8个字节,如果您刚刚执行了以下操作,则不需要存在8个字节:

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;
     ^

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

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;
       ^

相反:

{{1}}