如果您对 GCC 4.7 和 Boost 1.48 附带的 Fedora 17 进行香草安装,并使用 C++11 模式,则 Boost Intrusive 的 unordered_set 将被破坏。在带有 GCC 4.6.2 和 Boost 1.47 的 Fedora 16 上,它可以工作。这破坏了真实的代码,甚至破坏了官方文档中的示例:
#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 的错还是我的错?