[英]Overloading operator= breaks std::sort
可能是一个骗局,但我找不到它。
在敲击键盘两天之后,我发现重载equals运算符( operator=
)显然会破坏std::sort
。 也许我正在超载operator=
错误? 这是我的MCVE:
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <cstdint>
#include <vector>
struct Person
{
std::string name;
uint32_t age;
bool operator< (const Person& p)
{
return this->age < p.age;
}
Person operator= (const Person& p)
{
Person newP;
newP.name = p.name;
newP.age = p.age;
return newP;
}
static bool SortPeople(const Person& p1, const Person& p2)
{
return p1.age < p2.age;
}
};
void PrintPeople(const std::vector<Person>& people)
{
std::cout << "============ people begin" << std::endl;
for (const auto& pIt : people)
{
std::cout << "name: " << pIt.name << ", age: " << pIt.age << std::endl;
}
std::cout << "============ people end" << std::endl;
}
int main()
{
std::vector<Person> people = { { "james", 12 },
{ "jada", 4 },
{ "max", 44 },
{ "bart", 7 }
};
PrintPeople(people);
std::sort(people.begin(), people.end());
PrintPeople(people);
return 0;
}
如果我按原样运行此代码,则不会根据年龄对每个人进行排序。 PrintPeople
按照我初始化people
的相同顺序打印出来。但是,如果我注释掉整个Person operator=
function,那么people
会根据年龄按升序打印出来。 无论我调用std::sort(people.begin(), people.end());
我都会看到同样的行为std::sort(people.begin(), people.end());
或者std::sort(people.begin(), people.end(), Person::SortPeople);
,无论我使用g++
版本7.2.1还是clang++
版本4.0.1,我都会看到同样的行为。 我正在运行Fedora 27。
任何人都知道为什么重载operator=
break std::sort
?
我正在使用标志-Wall -Wextra -Wconversion -std=c++11
编译,没有警告。
你的operator=
overload从根本上被破坏了:它返回一个新对象(而不是对*this
的引用,就像强大的约定一样)而不会影响*this
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.