在C ++ 0x(n3126)中,可以比较智能指针,无论是关系还是相等。但是,这样做的方式似乎与我不一致。
例如,shared_ptr
定义operator<
等同于:
template <typename T, typename U>
bool operator<(const shared_ptr<T>& a, const shared_ptr<T>& b)
{
return std::less<void*>()(a.get(), b.get());
}
使用std::less
提供了与指针值相关的总排序,这与未指定的vanilla关系指针比较不同。
但是,unique_ptr
定义了与:
template <typename T1, typename D1, typename T2, typename D2>
bool operator<(const unique_ptr<T1, D1>& a, const unique_ptr<T2, D2>& b)
{
return a.get() < b.get();
}
它也以类似的方式定义了其他关系运算符。
为什么改变方法和“完整性”?也就是说,为什么shared_ptr
使用std::less
而unique_ptr
使用内置operator<
?为什么shared_ptr
也没有提供其他关系运算符,例如unique_ptr
?
我可以理解这两种选择背后的理由:
但我不明白为什么选择会根据智能指针类型进行更改。我错过了什么?
奖金/相关:std::less
似乎已经跟随std::shared_ptr
,后者忽略了“按设计”的其他关系运算符(因此boost::shared_ptr
也是如此)。这是为什么?
答案 0 :(得分:12)
这是C ++ 11草案的缺陷;已打开缺陷报告以更改std::unique_ptr
关系运算符重载以使用std::less
:请参阅LWG Defect 1297。
这是最终C ++ 11规范的及时修复。 C ++11§20.7.1.4[unique.ptr.special] / 5指定operator<
重载:
返回:
less<CT>()(x.get(), y.get())
其中x
和y
是运算符的两个操作数,CT
是两个指针的常见类型(因为指向不同类型的指针,例如具有不同的cv资格,可以比较)。