3

如果您对 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 的错还是我的错?

4

1 回答 1

1

这看起来与http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53234中描述的问题相同

即 Boost 1.48 假定 GCC 4.6 的旧行为,但 GCC 4.7 已更改为实现有关隐式定义的复制/移动构造函数的正确 C++11 语义。

于 2012-05-06T13:57:43.853 回答