添加 unique_ptr 作为 class 的实例字段,而不是显式删除复制/赋值构造函数

Add unique_ptr as instance field of a class instead of explicitly removing copy / assignment ctors

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

我的 class 中有一个 unique_ptr 会得到相同的结果吗?如果是这样,是否有理由不这样做?例如

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

禁止宏确实适用于 C++98/03。 C++11 具有用于消除 copy/assignment 的 = delete 运算符。添加 unique_ptr 会使您的 class 膨胀一点点,但更糟糕的是,我认为这只是实现删除 copy/assignment.

的一种非常迂回且不明确的方式
class Foo {
public:
  Foo(const Foo&) = delete;
  Foo& operator=(const Foo&) = delete;
};

会很清楚地实现这些结果。

是的,添加 unique_ptr<int> 成员将使您的 class 不可复制。但这几乎不是最好的解决方案。您刚刚向 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;
       ^