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のせいですか、それとも私のせいですか?