ты выделил блок памяти под ноду, в ноде есть место под Key и Value. Проинициализировал в ноде Key, попытался вставить в контейнер, если вставка удалась - проинициализировал Value
ты выделил блок памяти под ноду, в ноде есть место под Key и Value. Проинициализировал в ноде Key, попытался вставить в контейнер, если вставка удалась - проинициализировал Value
Да, наверное, это будет работать. Ноду вроде можно безопасно удалить при ошибке во время инициализации value части.
Что забавно - если для ассоциативных контейнеров iterator::operator* будет возвращать не pair<const Key, Value>&, а pair<const Key&, Value&>, то все UB можно было бы обойти
Что забавно - если для ассоциативных контейнеров iterator::operator* будет возвращать не pair<const Key, Value>&, а pair<const Key&, Value&>, то все UB можно было бы обойти
Меняем ключи в дереве и наслаждаемся происходящим?)
Да, наверное, это будет работать. Ноду вроде можно безопасно удалить при ошибке во время инициализации value части.
Хотя нет, все не так просто. На сколько я понимаю, будет нарушена гарантия по exception. Чтобы ее восстановить нам нужно будет вернуть ключ назад в аргумент.