Принимает ли std::map распределитель по ссылке, по значению или использует его исключительно как тип?

Когда std::map принимает Allocator в качестве параметра в конструкторе, он берет его по ссылке с типом, взятым из его параметра шаблона класса:

explicit map(const Allocator& alloc);

Сохраняет ли она эту ссылку в объекте, или она принимает копию (сохраняет ее по значению), или она не делает ни того, ни другого и использует ее только через параметр шаблона как тип? Как вы это определили?

1 ответ

Решение

Распределитель копируется в карту. std::map не указывает, что он делает, поэтому мы возвращаемся к [container.requirements.general]/8, в котором говорится:

[...] Все остальные конструкторы для этих типов контейнеров принимают const allocator_type& аргумент. [Примечание: если при вызове конструктора используется значение по умолчанию необязательного аргумента распределителя, то тип распределителя должен поддерживать инициализацию значения. - примечание конца] Копия этого распределителя используется для любого выделения памяти и построения элемента, выполняемого этими конструкторами и всеми функциями-членами в течение времени жизни каждого объекта контейнера или до замены распределителя.[...]

Акцент мой

Другие вопросы по тегам