我正在使用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.hpp
,operator<
不一致——在两种情况下都返回 false:
vmi_uuid != vmi2_uuid
禁用基于内在的标头会使事情恢复正常:
vmi_uuid != vmi2_uuid
vmi_uuid < vmi2_uuid
这只能使用特殊的 UUID (1
和2
) 重现,完全随机的 id 不会揭示这个问题。
我有带有 libboost 1.58 的 Ubuntu Xenial。如果重要的话,CPU是i7-6600U。我错过了什么吗?