You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类内用函数初始化multiset成员的语法及合理性问询

关于C++ multiset类内初始化器传入函数的语法疑问

先看这段代码:

class Basket{
public:
/*other contents*/
private:
    // function to compare shared_ptrs needed by the multiset member
    static bool compare(const std::shared_ptr<Quote> &lhs,
        const std::shared_ptr<Quote> &rhs)
    { return lhs->isbn() < rhs->isbn(); }
    // multiset to hold multiple quotes, ordered by the compare member
    std::multiset<std::shared_ptr<Quote>, decltype(compare)*>
        items{compare};
};

我理解multiset需要用和compare成员同类型的函数来排序,初始化items是为了让它使用这个compare函数,但搞不懂语法:类内初始化器通常是放同类对象,为什么这里能放函数进去?


这得从std::multiset的构造逻辑说起:

  • 首先,std::multiset的第二个模板参数是比较器的类型,这里写的decltype(compare)*,其实就是bool(*)(const std::shared_ptr<Quote>&, const std::shared_ptr<Quote>&)——也就是指向该类型函数的指针。
  • 当你定义带自定义比较器类型的multiset对象时,构造阶段必须传入一个该类型的实例(也就是对应的函数指针),作为容器实际使用的排序规则。
  • 这里的compare是类的静态成员函数,它的名字本身可以隐式转换成对应的函数指针,所以用{compare}初始化items,本质是把这个函数指针传给multiset的构造函数,让容器后续排序时都调用这个函数。

简单说,你误以为初始化器是往容器里塞元素?不对,这里的大括号是在调用multiset的构造函数,而非填充元素。对于指定了自定义比较器类型的multiset,构造时传入函数指针就是合法的初始化方式。

内容的提问来源于stack exchange,提问作者岁暮音书

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:20:55