cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

operator[]= #349

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +1, -5 Автор идеи: Konstantin Stupnik

Выделенный оператор для присвоения элемента контейнеру по индексу/ключу.

В данный момент невозможно (простым образом и без серьёзного overhead) разделить:

auto val = cnt[key];

и

cnt[key] = val;

Было бы во многих случаях очень полезно иметь выделенный оператор а-ля:

V& operator[]=(const K& key, V&& val);

Который бы вызывался только в случае:

cnt[key] = val;

Можно было бы создавать контейнеры защищенные от создания элемента на чтении.

apolukhin commented 3 years ago

yndx-antoshkka, 31 августа 2018, 12:35 У контейнеров на этот случай есть метод .at(const Key&)

Нужны очень веские аргументы, чтобы вводить в язык новый оператор. Попробуйте привести пример, где без этого оператора прям никак не обойтись.

Konstantin Stupnik, 2 сентября 2018, 16:26 yndx-antoshkka,

Понятно, что всё можно сделать методами с нужной семантикой. По большому счёту перегрузка операторов вообще не нужна. Вон джава живёт без перегрузки. Лично я столкнулся с необходимостью чёткого разделения чтения и записи когда делал обёртку для Vertext Buffer Array для OpenGL. Мне нужно было знать какие элементы были модифицированны, что бы заливать в видео память только изменённую часть.

С и использованием метода вместо оператора[] вычисления сложнее воспринимать.

Ну и по мне так это достаточно принципиальный косяк в дизайне - один оператор и на чтение и на запись. И отсутствие перегрузить отдельно именно запись является неприятным ограничением.

Игорь, 5 сентября 2018, 21:15 Konstantin Stupnik, даже если вводить этот оператор, как себя должен тогда вести объект, в котором перегружен ваш оператор и оператор= и мы вызываем []= , что тогда? Получается один из операторов будет заглушен, что уже криво и без костылей не обойтись. Никто не мешает вам сделать метод аля .get_and_set(1, "1");

Fihtangolz, 9 сентября 2018, 18:49 Konstantin Stupnik, напиши wrap для V, с operator =, и все будет работать ровно также как и с []=