Требуется наличие неконстантных значений в векторе:
/ Opt / составитель-исследователь / GCC-8.2.0 / Библиотека / GCC / x86_64-Linux-гну / 8.2.0 /../../../../ включают / C ++ / 8.2.0 / bits / stl_vector.h: 351: 7: ошибка: статический сбой не выполнен из-за требования 'is_same, allocator>, int>> :: type, const pair, allocator>, int>> :: value' "std :: vector должен иметь неконстантный, энергонезависимый тип_значения "
Начнем с требований к вектору до вопроса с распределителем. Тип vector
должен поддерживать это:
Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых над контейнером. Как правило, требуется, чтобы тип элемента соответствовал требованиям Erasable, но многие функции-члены предъявляют более строгие требования. Этот контейнер (но не его члены) может быть создан с неполным типом элемента, если распределитель удовлетворяет требованиям полноты распределителя.
Итак, нам нужно что-то, что может быть Erasable
и где мы можем сделать:
std::allocator_traits<A>::destroy(m, p);
с m
распределителем и p
типом, который мы хотим уничтожить. Справедливо. Что еще нам нужно? Для стирания нужен распределитель:
Указывает, что объект данного типа может быть уничтожен данным Allocator.
, что в свою очередь требует T
, чтобы быть cv-неквалифицированным :
T, cv-неквалифицированный тип объекта
Таким образом, вы можете иметь std::pair<const string, int>
, но не const std::pair<std::string, int>
.
В этом отношении сообщение MSVC более четкое, так как оно прямо говорит вам, что неправильно распределен распределитель.