Несмотря на нарушение множества предположений, справедливых для любого другого std::vector, он остается стандартизированным и неизменным на протяжении десятилетий.
Рассмотрим следующий пример:
#include
#include
int main() {
Код: Выделить всё
std::vector\ v = { true, false, true };
bool\* p = &v\[0\]; // error: not a bool\*
В отличие от других специализаций std::vector, std::vector:
- не хранит фактические логические объекты
- не предоставляет настоящие логические объекты*
- возвращает прокси-объект вместо ссылки от оператора []
В результате он нарушает такие ожидания, как как:
- получение адреса элементов
- API на основе указателей
- обработка его как обычного непрерывного контейнера
Мои вопросы:
1. Какова была первоначальная мотивация разработки std::vector и какие ограничения привели к такой специализации?
2. Какие точные гарантии предоставляет стандарт C++ для std::vector и какие гарантии std::vector явно не применяются?
3. Какие общие, казалось бы, разумные предположения о std::vector неверны для std::vector?
4. Какие альтернативы рекомендуются в современном C++ (C++20/23) и в каких случаях (если таковые имеются) std::vector по-прежнему является правильным или предполагаемым выбором?
Я специально ищу стандартные ссылки, обоснование комитета и исторический контекст, а не общие советы типа «не используйте std::vector».
Подробнее здесь: https://stackoverflow.com/questions/798 ... ly-provide
Мобильная версия