添加 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;
^
有一些宏可以防止 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;
^