在 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());
}
Usingstd::less
提供关于指针值的总排序,这与未指定的普通关系指针比较不同。
但是,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
use std::less
whileunique_ptr
使用内置的operator<
?为什么不shared_ptr
提供其他关系运算符,例如unique_ptr
?
我可以理解这两种选择背后的理由:
- 关于方法:它表示一个指针,因此只需使用内置的指针运算符,而它需要在关联容器中可用,以便提供总排序(就像使用默认
std::less
谓词模板参数获得的普通指针一样) - 关于完整性:它表示一个指针,因此提供与指针相同的所有比较,而它是一个类类型,只需要小于可比较即可在关联容器中使用,因此只提供该要求
但我不明白为什么选择会根据智能指针类型而变化。我错过了什么?
Bonus/related:std::shared_ptr
似乎来自boost::shared_ptr
,后者“设计”省略了其他关系运算符(也是如此std::shared_ptr
)。为什么是这样?