раз инициализировалось в конструкторе и более в него нельзя было бы добавить элементы? При этом с самим элементами в этом векторе должна быть возможность работать как не с const объектами.
А удалить? Если тоже нельзя, то можешь и простой С массив и std::array и еще подобного в бустах и гитхабах.
В фабрику оберни
Отдавать наружу только итераторы не поможет?
Ну и еще вариант тупо и просто написать свой классик для обертки malloc/free, new/delete или вообще какой умный указатель заюзать.
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
const
Тогда и элементы будут const, а мне так не надо.
class MyClass { public: MyClass() : vc({1, 2, 3, 4}) {} int& getElem(size_t idx) { return const_cast<int&>(vc[idx]); } private: const std::vector<int> vc; };
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Не знаю, что тут имелось ввиду, но элемент в таком векторе поменять нельзя.
Сделать из того, что изначально const - не const - это UB.
ну кажется что элементы вектора - не const
А не будет ли там какой-то оптимизации?
ну оптимизации тут не при делах, вопрос что в стандарте написано. Я не помню, чтобы там было что-то типа "если вектор помечен как const, то его внутренний массив тоже const" (и вообще кажется, что такая формулировка невозможна)
Если коллекция немутабельная, то и элементы её тоже. Это не в плюсах, это вообще так
ну значит вопрос в том, насколько const vector иммутабельный. Андрей утверждает (и на мой взгляд убедительно), что его иммутабельность это (в некоторых отношениях) конвенция.
Обойти завсегда можно. Но если вы пометили вектор как const и собираетесь что-то в нём менять, или что ещё хуже, ожидаете, что в нём что-то поменяется во время работы с ним, то вы, веооятно, что-то делаете не так. Наверно, не надо передавать его через константную ссылку, например
Ну насколько я понял, исходный кейс - это положить в приватное поле класса вектор так, чтобы нельзя было его ресайзить, но можно было менять его элементы.
Пусть пишут для этого контейнер.
Внутрений массив не конст, но operator[] возвращает константную ссылку
Тут нет, можно делать const_cast
Обсуждают сегодня