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

wrh*_*all 0 c++ copy-constructor unique-ptr c++11

有一些宏可以防止类被复制,例如: 宏禁止类复制和赋值.谷歌-vs- Qt

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

class Foo {
  private:
    std::unique_ptr<int> DISABLE_COPY;
};
Run Code Online (Sandbox Code Playgroud)

Sam*_*all 6

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

class Foo {
public:
  Foo(const Foo&) = delete;
  Foo& operator=(const Foo&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

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


Bar*_*rry 5

是的,添加unique_ptr<int>成员会使您的类不可复制.但这不是最好的解决方案.您刚刚添加了8个Foo字节,如果您刚刚执行了以下操作,则不需要存在8个字节:

class Foo {
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

此外,当您尝试意外复制时编译错误将更加清晰.考虑一下最新的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;
     ^
Run Code Online (Sandbox Code Playgroud)

相反:

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;
       ^
Run Code Online (Sandbox Code Playgroud)