Зачем нужна конструкция select_on_container_copy_construction? - PullRequest
0 голосов
/ 15 января 2019

Для распределителей, почему select_on_container_copy_construction необходим, а не перегружен конструктором копирования?

Существуют ли случаи, когда мы хотим определить две отдельные реализации конструкции копирования в зависимости от того, копируем ли мы фактический распределитель или контейнер?

1 Ответ

0 голосов
/ 15 января 2019

(Черта, на которую вы ссылаетесь, на самом деле называется select_on_container_copy_construction.)

Конструкторы копирования стандартных контейнеров библиотеки фактически перегружены и предоставляют расширенную версию распределителя:

A a1 = f(), a2 = g();  // allocators

std::vector<int, A> v1(a1);
std::vector<int, A> v2(v1, a2);  // allocator-extended copy
std::vector<int, A> v3 = v1;     // regular copy, uses select_on_container_copy_construction

Однако использование перегрузки не всегда является вариантом, и, как правило, контейнеры с распределителем должны использоваться так же легко и без проблем, как если бы вы не знали о выборе распределителя. Это означает, что некоторые решения, например, как распределить копию контейнера, могут нуждаться в настройке напрямую через тип распределителя, а не через тип пользователя.

Например, вы можете представить себе ситуацию, когда все содержимое одного вектора попадает на одну (возможно, растущую) арену, но когда вы создаете новый вектор, вы хотите, чтобы это вышло на новую отдельную арену, и Общий код не должен знать об этом.

Является ли эта функция библиотеки полезной на практике - это отдельный вопрос, но, надеюсь, это показывает, почему у этой детали есть мотивация.

...