Вимоги до контейнерів змінилися з C ++ 03 на C ++ 11. Хоча C ++ 03 мав загальні вимоги (наприклад, конструктивність копіювання та призначення для вектора), C ++ 11 визначає дрібні вимоги щодо кожної операції з контейнером (розділ 23.2).
Як результат, ви можете, наприклад, зберігати тип, який можна сконструювати, але не можна призначити - наприклад, структуру з елементом const - у векторі, якщо ви виконуєте лише певні операції, які не вимагають присвоєння (побудова і push_backє такими операціями ; insertне є).
Мені цікаво: чи означає це, що зараз дозволяє стандарт vector<const T>? Я не бачу жодної причини, чому це не повинно - так const Tсамо, як структура з членом const - це тип, який можна конструювати за копією, але не можна призначити - але я, можливо, щось пропустив.
(Частиною того, що змушує мене думати, що я щось міг пропустити, є те, що магістральний gcc аварійно завершує роботу і згорає, якщо ви намагаєтеся створити екземпляр vector<const T>, але це добре з тим, vector<T>де у T є учасник const).
addressфункцій-членів у розподілювачі за замовчуванням: Коли T є const, ці дві перевантаження мають однаковий підпис. Найпростішим способом виправити це було б спеціалізаціяstd::allocator<const T>та усунення одного з перевантажень.