Обоснование было описано в N3465.
Концептуально расширение состоит в замене оригинальной формулировки на основе строгих слабых порядков, основанной на понятии разбиения последовательностей, как это было впервые предложено Дэвидом Абрахамом. К сожалению, этот процесс расширения не был выполнен для операций поиска ассоциативных контейнеров, которые все еще сформулированы в терминах строгих слабых порядков и, таким образом, не допускают гетерогенных сопоставлений .
Возьмем такого примера из N3465, и изменить его немного:
struct name_entry
{
std::string family_name;
std::string given_name;
};
auto as_tuple(const name_entry& e)
{
return std::tie(e.family_name, e.given_name);
}
bool operator<(const name_entry& x, const name_entry& y)
{
return as_tuple(x) < as_tuple(y);
}
bool operator<(const name_entry& x, const std::string& y)
{
return x.family_name<y;
}
bool operator<(const std::string& x, const name_entry& y)
{
return x<y.family_name;
}
int main()
{
std::set<name_entry, std::less<>> names;
}
Гетерогенного сравнение было изобретен дуэлью с найти содержащийся объект, который удовлетворяет частичное сравнение, как найти кого-то есть данная фамилия.
operator[]
, в другой стороны, будет построить value_type
если key
не найден, то необходимо применять строгий слабый порядок с этой операцией, таким образом cannt применяться с гетерогенным сравнением
Поскольку [] не получило более перегрузки в 14, в отличие от find ...? – deviantfan
'operator []' также вставляет, если не найден – Danh
@deviantfan, Почему бы не перегрузить []? – xmllmx