【问题标题】: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()`?
【发布时间】:2020-05-23 09:57:35
【问题描述】:

name_compare() 是调用默认构造还是sort(vs.begin(), vs.end(), name_compare());class name_compareoperator()

我认为是第一个。对吗?

如果您能提供有关此问题的任何提示,我将不胜感激。

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

【问题讨论】:

  • operator() 不能在没有对象的情况下被调用。它不是静态函数,也不能是静态的。

标签: c++ function-object


【解决方案1】:

在本次通话中

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 )

【讨论】:

  • 感谢您的澄清。我想知道临时对象(name_compare())是通过值传递还是通过引用传递给std::sort
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多