错误而拷贝构造的boost :: shared_ptr的使用C ++ 11(Error while

2019-07-30 05:06发布

昨天我装铛3.1和g ++ 4.7,并试图编译一个项目我工作。 我很惊讶地看到,它没有编译使用两种编译器。 但是,最让我惊讶的是,这个问题是在boost::shared_ptr

显然,由于类定义了移动构造函数/赋值运算符,拷贝构造函数被隐式删除。 所以这个代码:

#include <boost/shared_ptr.hpp>

int main() {
    boost::shared_ptr<int> x;
    boost::shared_ptr<int> y(x);
}

不能编译。 铛呼应此错误:

test.cpp:5:28: error: call to implicitly-deleted copy constructor of
      'boost::shared_ptr<int>'
    boost::shared_ptr<int> y(x);
                           ^ ~
/usr/include/boost/smart_ptr/shared_ptr.hpp:347:5: note: copy constructor is
      implicitly deleted because 'shared_ptr<int>' has a user-declared move
      constructor
    shared_ptr( shared_ptr && r ): px( r.px ), pn() // never throws
    ^

克++ 4.7提供了一个类似的错误,指的是隐式地删除构造为好。 奇怪的是, boost::shared_ptr ,实际上明确定义拷贝构造函数(升压/ smart_ptr / shared_ptr.hpp线228):

    template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )

    shared_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )

#else

    shared_ptr( shared_ptr<Y> const & r )

#endif
    : px( r.px ), pn( r.pn ) // never throws
    {
    }

我使用升压1.48.0.2,这是相当新的。 有谁知道是怎么回事? 为什么它实际上是在定义时没有被检测到的拷贝构造函数? 这是固定在智能指针库的新版本? 我无法找到任何更新日志。

Answer 1:

这是加速已知错误。 升压的旧版本(1.48或更低)下不C ++ 11可编译,至少,不是全部。 就个人而言,我使用此解决方法:

#ifdef MY_LIB_COMPILING_UNDER_CXX11

#include <memory>

namespace my_lib {

using std::shared_ptr;
using std::weak_ptr;

};

#else

#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

namespace my_lib {

using boost::shared_ptr;
using boost::weak_ptr;

};

#endif

MY_LIB_COMPILING_UNDER_CXX11是,你要么设置传递到编译器或编译器的C ++ 11米的标志派生它的标志。 而且,当时,在库的其余部分我只用my_lib::shared_ptr 。 这工作得很好。



文章来源: Error while copy constructing boost::shared_ptr using C++11