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,提问作者岁暮音书
相关产品推荐
相关产品推荐

