C++0x 智能指针比较 : Inconsistent, 原理是什么?

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

在 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())

哪里xy是运算符和CT的两个操作数是两个指针的公共(public)类型(因为可以比较指向不同类型的指针,例如具有不同 cv 限定的指针)。

关于C++0x 智能指针比较 : Inconsistent, 原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929563/

相关文章:

c++ - 错误 : there are no arguments to 'at' that depend on a template parameter, 因此 at 的声明必须可用

c++ - 寻找将 std::wstring 与 NSLog 一起使用的最便宜的方法

c++ - 返回值为枚举的地址数组

c++ - 如何从数组写入输出文件?

c++ - 在 C++ 模板中使用 'using' 的正确做法

c++ - C++ std::unordered_map 中使用的默认哈希函数是什么?

c++ - C++ 标准中的 move 概念

c++ - 具有怪异行为的井字游戏Minimax算法(C++)

c++ - GCC 或 Clang 关于函数参数的名称在其自己的默认参数范围内是否正确?

c++ - 为什么 std::modulus 定义为仅适用于整数而不适用于 float