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

时间:2010-10-14 02:11:56

标签: c++ c++11 std smart-pointers rationale

在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::lessunique_ptr使用内置operator<?为什么shared_ptr也没有提供其他关系运算符,例如unique_ptr

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

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

但我不明白为什么选择会根据智能指针类型进行更改。我错过了什么?


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

1 个答案:

答案 0 :(得分:12)

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

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

  

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

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