3

GCC4.7とBoost1.48に付属するFedora17のバニラインストールを実行し、C ++ 11モードを使用すると、BoostIntrusiveのunordered_setが壊れます。GCC4.6.2とBoost1.47が付属しているFedora16では、動作します。これは実際のコードを壊し、公式ドキュメントの例さえも壊します:

#include <boost/intrusive/unordered_set.hpp>

using namespace boost::intrusive;

struct MyClass : public unordered_set_base_hook<>
{};

typedef unordered_set<MyClass>::bucket_type   bucket_type;
typedef unordered_set<MyClass>::bucket_traits bucket_traits2;

int main()
{
   bucket_type buckets[100];
   unordered_set<MyClass> uset(bucket_traits2(buckets, 100)); // FAILS
}

エラーメッセージ:

/usr/include/boost/intrusive/hashtable.hpp:227:65:エラー:削除された関数の使用'constexpr boost :: intrusive :: detail ::bucket_traits_impl> :: type> ::bucket_traits_impl(const boost :: intrusive: :detail ::bucket_traits_impl> :: type>&)'</ p>

/usr/include/boost/intrusive/hashtable.hpp:30:0、/usr/include/boost/intrusive/unordered_set.hpp:18、t.cpp:23からインクルードされたファイル:

/usr/include/boost/intrusive/detail/hashtable_node.hpp:80:8:注:'constexpr boost :: intrusive :: detail ::bucket_traits_impl> :: type> ::bucket_traits_impl(const boost :: intrusive :: detail ::bucket_traits_impl> :: type>&)'は、' boost :: intrusive :: detail ::bucket_traits_impl> :: type>'がムーブコンストラクターまたはムーブ代入演算子を宣言しているため、暗黙的に削除済みとして宣言されます

これが参照するコード、hashtable.hpp:227です。

template<class BucketTraits>
bucket_plus_size(BOOST_FWD_REF(BucketTraits) b_traits)
   : bucket_traits_(::boost::forward<BucketTraits>(b_traits))
{}

Boost 1.47では、これは次のとおりです。

bucket_plus_size(const bucket_traits &b_traits)
   : bucket_traits_(b_traits)
{}                 

BOOST_FWD_REF(TYPE)私のシステムではTYPE &&デフォルトで定義されていますが、定義されている場合BOOST_NO_RVALUE_REFERENCESはになりconst TYPE &ます。そして、私がそれをそのように定義すると、コードはコンパイルされます!

これがなぜであるかについて何か考えはありますか?それはGCCのせいですか、Boostのせいですか、Fedoraのせいですか、それとも私のせいですか?

4

1 に答える 1

1

これは、http: //gcc.gnu.org/bugzilla/show_bug.cgi?id=53234で説明されているのと同じ問題のように見えます

つまり、Boost1.48はGCC4.6の古い動作を想定していますが、GCC 4.7は、暗黙的に定義されたコピー/移動コンストラクターに関する正しいC++11セマンティクスを実装するように変更されました。

于 2012-05-06T13:57:43.853 に答える