在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
?
我可以理解这两种选择背后的理由:
- 关于方法:它代表一个指针,所以只需使用内置的指针运算符,而不是它需要在一个关联容器中使用,所以提供总排序(就像一个vanilla指针将获得默认值
std::less
谓词模板参数) - 关于完整性:它代表一个指针,因此提供与指针相同的所有比较,而它是一个类类型,只需要比在关联容器中使用的相当,所以只提供该要求
但我不明白为什么选择 变化 取决于智能指针类型。我错过了什么?
奖金/相关: std::shared_ptr
似乎已经跟着 boost::shared_ptr
,后者省略了“按设计”的其他关系运算符(等等) std::shared_ptr
也是。为什么是这样?