boost::noncopyable 分析

来源:互联网 发布:linux查看javahome 编辑:程序博客网 时间:2024/06/06 12:43

取自boost1.61

boost::noncopyable实现了noncopyable的语义,可以通过继承它来使用,下面是它的实现:

namespace boost {//  Private copy constructor and copy assignment ensure classes derived from//  class noncopyable cannot be copied.//  Contributed by Dave Abrahamsnamespace noncopyable_  // protection from unintended ADL{  class noncopyable  {  protected:#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)      BOOST_CONSTEXPR noncopyable() = default;      ~noncopyable() = default;#else      noncopyable() {}      ~noncopyable() {}#endif#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)      noncopyable( const noncopyable& ) = delete;      noncopyable& operator=( const noncopyable& ) = delete;#else  private:  // emphasize the following members are private      noncopyable( const noncopyable& );      noncopyable& operator=( const noncopyable& );#endif  };}typedef noncopyable_::noncopyable noncopyable;} // namespace boost</span>
实现中通过protected的构造函数来说明类要通过继承来使用的语义和限制的拷贝和赋值来说明noncopyable的语义,并提供了c++03和c++11的版本。


当我看到这个实现的时候,有这个疑问:

针对c++03的实现,只是声明了拷贝和赋值,没有定义,这样已经可以实现noncopyable的语义了,为什么还要加上private?为什么对c++11的实现没有限定为private?

我想是因为从类的使用者角度来讲,如果没有限定为private,不会一目了然的明确类是不可拷贝和赋值的,而且如果使用了拷贝和赋值语义,将会是一个运行时错误,如果限定了private, 就是个编译期的错误,也会明确的知道类是不可拷贝和赋值,对此作者也添加了注释: emphasize the following members are private,而对于c++11的实现,就不需要多此一举,一个delete搞定,非常明确的不可拷贝和赋值的语义,如果不小心拷贝和赋值了,也会是一个编译期错误。


0 0
原创粉丝点击