C++ 0x智能指针比较:不一致,理由是什么?

GMa*_*ckG 11 c++ smart-pointers std rationale c++11

在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());
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

它还以类似的方式定义了其他关系运算符.


为什么改变方法和"完整性"?也就是说,为什么shared_ptr使用std::less,而unique_ptr使用内置的operator<?为什么不shared_ptr提供其他关系运算符,比如unique_ptr

我可以理解这两种选择背后的理由:

  • 关于方法:它代表一个指针,所以只需使用内置指针运算符,而不是它需要在一个关联容器中使用,所以提供总排序(就像一个vanilla指针将使用默认的std::less谓词模板参数获得)
  • 关于完整性:它表示一个指针,因此提供与指针相同的所有比较,而它是一个类类型,只需要比在关联容器中使用的相当,所以只提供该要求

但我不明白为什么选择根据智能指针类型而改变.我错过了什么?


奖金/相关:std::shared_ptr似乎已经跟随boost::shared_ptr,后者省略了"按设计"的其他关系运算符(也是如此std::shared_ptr).为什么是这样?

Jam*_*lis 12

这是C++ 11草案中的一个缺陷; 打开缺陷报告以更改std::unique_ptr要使用的关系运算符重载std::less:请参阅LWG缺陷1297.

这是最终C++ 11规范的及时修复.C++11§20.7.1.4[unique.ptr.special]/5指定了operator<重载:

返回: less<CT>()(x.get(), y.get())

其中xy是操作符的两个操作数,并且CT是两个指针的常见类型(因为可以比较指向不同类型的指针,例如具有不同的cv资格).