Принимает ли std::map распределитель по ссылке, по значению или использует его исключительно как тип?
Когда std::map
принимает Allocator в качестве параметра в конструкторе, он берет его по ссылке с типом, взятым из его параметра шаблона класса:
explicit map(const Allocator& alloc);
Сохраняет ли она эту ссылку в объекте, или она принимает копию (сохраняет ее по значению), или она не делает ни того, ни другого и использует ее только через параметр шаблона как тип? Как вы это определили?
1 ответ
Распределитель копируется в карту. std::map
не указывает, что он делает, поэтому мы возвращаемся к [container.requirements.general]/8, в котором говорится:
[...] Все остальные конструкторы для этих типов контейнеров принимают const allocator_type& аргумент. [Примечание: если при вызове конструктора используется значение по умолчанию необязательного аргумента распределителя, то тип распределителя должен поддерживать инициализацию значения. - примечание конца] Копия этого распределителя используется для любого выделения памяти и построения элемента, выполняемого этими конструкторами и всеми функциями-членами в течение времени жизни каждого объекта контейнера или до замены распределителя.[...]
Акцент мой