private或public继承自boost::non_copyable
privately or publicly inherit from boost::non_copyable?
您会推荐哪种做法,为什么?
class Foo : public boost::noncopyable {};
与
class Foo : private boost::noncopyable {};
我无法想象需要使用Foo的实例作为boost::noncopyable,所以在这种情况下我倾向于私有继承。
boost::noncopyable
没有声明virtual
析构函数,即不被设计为公共继承链的基础。
我认为从更高的角度来看应该是public
继承。使其成为private
的原因纯粹是技术上的。
为什么?因为类型是否可复制(这是通过继承boost::noncopyable
显示的)是public接口的一部分。例如,如果继承是public
,您将能够检查(使用"元编程")类型是否派生自boost::noncopyable
,然后推断它是否可复制。
Nikolai N Fetissov在回答这个问题时指出,boost::noncopyable
没有virtual
析构函数,因此不应该用作public
基类。虽然一般来说这是一个有效的参数,但我认为任何人都不太可能尝试通过指向boost::noncopyable
的指针来使用对象(特别是delete
),这使得该参数(在这种特殊情况下)纯粹是学术性的。
来吧!如果有人是如此倾向于滥用代码,他使用delete
指针到boost::noncopyable
,那么没有办法是安全的。当然,你可以让它更难一点,但一个如此坚定的程序员无论如何都会找到其他方法来误用代码。
似乎在c++ 11中boost::noncopyable
可以通过声明default
protected
destructor来解决这个问题:
protected:
~noncopyable() = default;
这样就不会有声明析构函数的额外开销(因为我们把它改成了default
),同时在指向boost::noncopyable
的指针上保护我们不受delete
的影响。
boost::noncopyable
的继承来检查类型是否可复制。主要是因为它不能提供完整的答案。仅仅因为一个类型不是来自boost::noncopyable
,并不意味着它是可复制的。
还要注意Boost。不可复制文档建议使用private
继承
根据Boost文档
用作私有基。
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 为什么std::copyable包含std::moveable
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- WinSock Non-Blocking I/O
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- C++ "Invalid use of 'this' in non-member function" ,
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Linux non-persistent backing store for mmap()
- std::span constructor, libcxx vs libstdc++, template vs non-
- "Warning : No return statement in function returning non-void"是什么意思?
- 从Qt QJsonDocument::toBinaryData使用non-Qt读取Binary Json?
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 函数参数中的向量"Non-standard syntax"错误
- 如何在 GCC 中将"non trivially copyable objects"传递到 varargs 函数中
- 为什么显示 - "cannot pass objects of non-trivially-copyable type"?