`name_compare()` 在`sort(vs.begin(), vs.end(), name_compare());`?

Does `name_compare()` calls the default construction or the `operator()` of `class name_compare` in `sort(vs.begin(), vs.end(), name_compare());`?

name_compare()是在sort(vs.begin(), vs.end(), name_compare());中调用class name_compare的默认构造还是operator()

我认为这是第一个 one.Am 我对吗?

如能就此问题提供任何提示,我将不胜感激。

 struct Record {
        string name;
        // ...
    };
    struct name_compare {   // compare Records using "name" as the key
        bool operator()(const Record& a, const Record& b) const
            { return a.name<b.name; }
    };
    void f(vector<Record>& vs)
    {
        sort(vs.begin(), vs.end(), name_compare());
        // ...
    }   

在本次通话中

sort(vs.begin(), vs.end(), name_compare());

使用默认构造函数创建了一个 name_compare 类型的临时对象作为函数参数。在函数 std::sort 中,调用了对象的运算符函数。

这是一个演示程序

#include <iostream>
#include <string>

struct Record
{
    std::string name;
};

struct name_compare 
{
    name_compare()
    {
        std::cout << "name_compare() is called\n";
    }

    bool operator()( const Record &a, const Record &b ) const
    {
        std::cout << "operator () is called\n";
        return a.name<b.name; 
    }
};

int main() 
{
    Record a = { "A" };
    Record b = { "B" };

    if ( name_compare()( a, b ) ) std::cout << a.name << " is less than " 
                                            << b.name << '\n';


    return 0;
}

它的输出是

name_compare() is called
operator () is called
A is less than B

在这个表达式中

name_compare()( a, b )

调用构造函数创建一个临时对象

name_compare()( a, b )
^^^^^^^^^^^^^^

然后就是调用创建对象的运算符函数

name_compare()( a, b )
              ^^^^^^^^

为了表达得更清楚,您可以将表达式重写为以下方式

name_compare().operator ()( a, b )