使用boost::引用元组作为orderedunique索引的关键字时出现boost多索引插入错误



我已经把它归结为我能想到的最简单的示例代码。

我有一个由成员多重索引的提升:

typedef const boost::tuple<const uint32_t &, const uint8_t &> key_type;

这样做似乎会让多索引认为每个项目都是相等的(大小从不大于1)

我正在存储一个有2个成员的结构,我希望多索引的唯一键同时是这两个成员。我认为制作一个引用元组可以相当简单地实现这一点。不过,它的行为并不像我预期的那样。当元组中的项是引用时,似乎每个新项都与现有项冲突。可能还值得注意的是,简单地远离引用会使代码的行为如我所期望的那样,但这并不能帮助我理解为什么引用案例不起作用。

#include <stdint.h>
#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/tag.hpp>
#include "boost/tuple/tuple.hpp"
#include "boost/tuple/tuple_comparison.hpp"
namespace bmi = ::boost::multi_index;
class MyMultiIndex {
public:
    MyMultiIndex() {}
    ~MyMultiIndex() {}
    // Switching away from references fixes everything....
    typedef const boost::tuple<const uint32_t &, const uint8_t &> key_type;
    //typedef const boost::tuple<const uint32_t, const uint8_t> key_type;
    struct Item {
        const uint8_t thing1;
        const uint32_t thing2;
        key_type key;
        Item(const uint8_t &a1, const uint32_t &a2)
                : thing1(a1), thing2(a2), key(thing2, thing1)
        {}
    };
    struct key_idx {};
    typedef bmi::multi_index_container<
        Item,
        bmi::indexed_by<
            bmi::ordered_unique<bmi::tag<key_idx>,
                                bmi::member<Item, key_type, &Item::key>
            >
        >
    > imsi_map_type;
    typedef imsi_map_type::index<key_idx>::type key_idx_type;
    void insert(const uint8_t &a1, const uint32_t &a2)
    {
        Item item(a1, a2);
        key_idx_type &idx(mi.get<key_idx>());
        std::pair<key_idx_type::iterator, bool> ret = idx.insert(item);
        if (!ret.second) {
            std::cout << "itr = " << (int)ret.first->thing1 << " " << ret.first->thing2 << std::endl;
        }
    }
private:
    imsi_map_type mi;
};
int
main()
{
    MyMultiIndex mindex;
    mindex.insert(1, 10);
    mindex.insert(1, 20);
    mindex.insert(3, 10);
    return 0;
}

如示例中所述,如果我使元组包含值而不引用,那么一切都会如我所期望的那样工作。

我花了一些时间研究各种可能性(悬挂引用,比较boost:在没有多索引的较小程序中的引用元组,等等)

这是我的编译命令:g++-O0-ggdb-Wall-Weror测试.cc-lbostrongystem-lpthread

运行该程序会给出:

itr=110itr=1 10

表明即使我试图插入1,20和3,10,multi似乎认为它们等于1,10。

我很困惑。感谢您的任何帮助。

Item的复制语义(由其默认的复制ctor实现)存在缺陷。提供一个像这样的副本:

Item(const Item& x)
  : thing1(x.thing1), thing2(x.thing2), key(thing2, thing1)
{}

相关内容

  • 没有找到相关文章

最新更新