3

昨日、clang 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);
}

コンパイルしません。clang は次のエラーを表示します。

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
    ^

g++ 4.7 では、暗黙的に削除されたコンストラクターも参照して、同様のエラーが発生します。奇妙なことにboost::shared_ptr、実際には明示的にコピー コンストラクターを定義しています (boost/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 を使用しています。ここで何が起こっているか知っている人はいますか?実際に定義されているときにコピーコンストラクターが検出されないのはなぜですか? これは、スマート ポインター ライブラリの新しいバージョンで修正されていますか? 変更ログには何も見つかりませんでした。

4

1 に答える 1

5

これは Boost の既知のバグです。Boost の古いバージョン (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。これは非常にうまく機能します。

于 2012-07-03T00:05:28.933 に答える