multiset
第二个参数预期的类型是Predicate。这是一个对象的类型,c
它c(lhs, rhs)
返回可转换为bool
的东西。
compare
and的类型decltype(compare)
是函数类型。不能有函数类型的值,但可以有指针的值和对函数类型的引用。这就是为什么你需要那里。(实际上,有函数类型的值,并且是您声明为函数的那些东西,但是除了调用它们并获取它们的地址之外,它们不能被创建、复制,也几乎没有任何东西。)总结:bool(shared_ptr<int>, shared_ptr<int>)
*
decltype(compare)* ==> bool (*)(shared_ptr<int>, shared_ptr<int>)
这是一个指向函数的指针,该函数采用两个shared_ptr<int>
s 的值并返回 a bool
。然后,在multiset
构造函数中,给它一个该类型的值:
items{ compare }; // value
或者更具体地说,函数类型的值将衰减为函数指针类型。所以让我们明确一点:
items{ &compare }; // pointer to function compare
如果你没有给它任何东西,那么它将是一个空指针,当你试图调用它来进行比较时,你的应用程序会崩溃。
总之,你选择了一个非常复杂的案例来处理(我已经跳过了一些我应该提到的事情)。这是一种更简单的方法:
struct shared_ptr_compare
{
bool operator()(std::shared_ptr<int> const& lhs, std::shared_ptr<int> const& rhs) const
{ return /*...*/; }
};
multiset<shared_ptr<int>, shared_ptr_compare> item; // no need to initialize
// shared_ptr_compare with anything, a default value will do just fine
注意:我删除了顶级const
修饰符,因为它对函数参数没有影响,它只向函数体发出无法更改值的信号。所以它确实有意义,但使解释类型复杂化。
注意 2:您应该将这些参数作为shared_ptr<int> const&
(与 相同的东西const shared_ptr<int>&
),因为您实际上不需要副本,并且这些副本必须保留一个引用计数器,这是一个必须在线程之间同步的操作。