代码之家  ›  专栏  ›  技术社区  ›  GManNickG

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

  •  11
  • GManNickG  · 技术社区  · 15 年前

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

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


    为什么要改变方法和“完整性”?那就是为什么 SelddPPTR 使用 STD::少 虽然 尤尼奎 使用内置的 运算符; ?为什么不 SelddPPTR 还提供其他关系运算符,例如 尤尼奎 ?

    我可以理解这两种选择背后的基本原理:

    • 关于方法:它表示一个指针,所以只需使用内置的指针运算符,而它需要在关联容器中可用,因此提供总排序(就像普通指针在默认情况下得到的那样 STD::少 谓词模板参数)
    • 关于完整性:它表示一个指针,因此提供与指针相同的比较,而它是一个类类型,只需要比关联容器中使用的要小,因此只提供该要求。

    但我不明白为什么选择 变化 取决于智能指针类型。我错过了什么?


    奖金/相关: std::shared_ptr 似乎是从 boost::shared_ptr ,后者“按设计”省略了其他关系运算符(因此 STD::SaldypPTR 也一样。为什么会这样?

    1 回复  |  直到 13 年前
        1
  •  12
  •   James McNellis    13 年前

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

    这是固定的时间为最终的C++ 11规范。C++ 11×20.7.1.4 [唯一的.PTR。特殊] / 5指定 operator< 超载:

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

    在哪里? x y 是运算符和的两个操作数 CT 是两个指针的常见类型(因为可以比较指向不同类型的指针,例如具有不同CV资格的指针)。