Рассмотрим следующий простой пример, где я использую std::equal_to
для сравнения двух std::pair<std::string, unsigned>
. operator new
перегружен так, что она печатает сообщение, когда распределение имеет место (живой код здесь):
#include <functional>
#include <string>
#include <iostream>
// overloaded to see when heap allocations take place
void* operator new(std::size_t n)
{
std::cout << "Allocating " << n << std::endl;
return malloc(n);
}
int main()
{
using key_type = std::pair<std::string, unsigned>;
auto key1 = std::make_pair(std::string("a_______long______string______"), 1);
auto key2 = std::make_pair(std::string("a_______long______string______"), 1);
std::cout << "Finished initial allocations\n\n" << std::endl;
std::equal_to<key_type> eq;
eq(key1, key2); // how can this cause dynamic allocation???
}
Сообщение, которое я вижу, это
Allocating 31
Allocating 31
Finished initial allocations
Allocating 31
Allocating 31
Вы можете увидеть, что при сравнении key1
и key2
происходит два распределения. Но почему? Оператор std::equal_to
принимает свои аргументы по ссылке const, поэтому распределение не должно происходить... чего я не вижу? Благодарю.