【发布时间】:2011-04-25 04:19:39
【问题描述】:
在 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 提供关于指针值的总排序,这与未指定的普通关系指针比较不同。
但是,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 继承而来的,后者“按设计”省略了其他关系运算符(std::shared_ptr 也是如此)。这是为什么呢?
【问题讨论】:
标签: c++ c++11 std smart-pointers rationale