0

我正在使用boost::uuids内部地图(labeled_graph实际上),所以我需要一个正常工作的operator <. 不幸的是,它不是,如果BOOST_UUID_USE_SSE2启用(因此,uuid_x86.hpp被使用)。

这是示例代码:

#include <boost/uuid/nil_generator.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <string>
#include <sstream>
#include <iostream>

#include <assert.h>

#define CHECK(x)  do { if(x) { std::cout << #x << "\n"; } } while(0)

static inline boost::uuids::uuid StringToUuid(const std::string &str)
{
    boost::uuids::uuid u = boost::uuids::nil_uuid();
    std::stringstream uuidstring(str);
    uuidstring >> u;
    return u;
}

int main() {
    boost::uuids::uuid vmi_uuid = StringToUuid("00000000-0000-0000-0000-000000000001");
    boost::uuids::uuid vmi2_uuid = StringToUuid("00000000-0000-0000-0000-000000000002");

    CHECK(vmi_uuid != vmi2_uuid);
    CHECK(vmi_uuid < vmi2_uuid);
    CHECK(vmi2_uuid < vmi_uuid);

    return 0;
}

使用时uuid_x86.hppoperator<不一致——在两种情况下都返回 false:

vmi_uuid != vmi2_uuid

禁用基于内在的标头会使事情恢复正常:

vmi_uuid != vmi2_uuid
vmi_uuid < vmi2_uuid

这只能使用特殊的 UUID (12) 重现,完全随机的 id 不会揭示这个问题。

我有带有 libboost 1.58 的 Ubuntu Xenial。如果重要的话,CPU是i7-6600U。我错过了什么吗?

4

0 回答 0