`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 )
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 )