(Черта, на которую вы ссылаетесь, на самом деле называется 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
Однако использование перегрузки не всегда является вариантом, и, как правило, контейнеры с распределителем должны использоваться так же легко и без проблем, как если бы вы не знали о выборе распределителя. Это означает, что некоторые решения, например, как распределить копию контейнера, могут нуждаться в настройке напрямую через тип распределителя, а не через тип пользователя.
Например, вы можете представить себе ситуацию, когда все содержимое одного вектора попадает на одну (возможно, растущую) арену, но когда вы создаете новый вектор, вы хотите, чтобы это вышло на новую отдельную арену, и Общий код не должен знать об этом.
Является ли эта функция библиотеки полезной на практике - это отдельный вопрос, но, надеюсь, это показывает, почему у этой детали есть мотивация.