有一些宏可以防止复制类,例如: Macros to disallow class copy and assignment. Google -vs- Qt
只要在班上有一个unique_ptr,我会得到相同的结果吗?如果是这样,有没有理由不这样做?例如
class Foo {
private:
std::unique_ptr<int> DISABLE_COPY;
};
答案 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}}