在 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
开始的,后者“按设计”省略了其他关系运算符(因此 std::shared_ptr
也是如此)。这是为什么?
最佳答案
这是 C++11 草案中的一个缺陷;已打开缺陷报告以更改 std::unique_ptr
关系运算符重载以使用 std::less
:见LWG Defect 1297 .
这在最终的 C++11 规范中及时得到修复。 C++11 §20.7.1.4[unique.ptr.special]/5 指定 operator<
过载:
Returns:
less<CT>()(x.get(), y.get())
哪里x
和 y
是运算符和CT
的两个操作数是两个指针的公共(public)类型(因为可以比较指向不同类型的指针,例如具有不同 cv 限定的指针)。
关于C++0x 智能指针比较 : Inconsistent, 原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929563/