昨日、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 を使用しています。ここで何が起こっているか知っている人はいますか?実際に定義されているときにコピーコンストラクターが検出されないのはなぜですか? これは、スマート ポインター ライブラリの新しいバージョンで修正されていますか? 変更ログには何も見つかりませんでした。