Size: a a a

2020 September 21

m

magras in pro.cxx
Андрей Руссков
так у тебя find вернет end()
Да, lower_bound нет для unordered.(
источник

АР

Андрей Руссков... in pro.cxx
короче по мне так реально сделать emplace так, чтобы он не требовал создания ValueType в случае провала
источник

АР

Андрей Руссков... in pro.cxx
единственный нюанс - там будут грабли с формальным UB )
источник

АР

Андрей Руссков... in pro.cxx
что в прочем не должно останавливать поставщиков стдлибы, как минимум для собственных компиляторов
источник

m

magras in pro.cxx
Андрей Руссков
короче по мне так реально сделать emplace так, чтобы он не требовал создания ValueType в случае провала
Это приведет к требованию movable на Key. Или двойному конструированию.
источник

АР

Андрей Руссков... in pro.cxx
например в std::map всё равно есть этот замечательный ub
источник

АР

Андрей Руссков... in pro.cxx
когда value_type это pair<cost Key, Value>, но при этом константность Key должна теряться при extract
источник

АР

Андрей Руссков... in pro.cxx
magras
Это приведет к требованию movable на Key. Или двойному конструированию.
нет никакого требования
источник

АР

Андрей Руссков... in pro.cxx
ты выделил блок памяти под ноду, в ноде есть место под Key и Value. Проинициализировал в ноде Key, попытался вставить в контейнер, если вставка удалась - проинициализировал Value
источник

АР

Андрей Руссков... in pro.cxx
собственно std::optional так и работает, только там получается будет не совсем нужный флаг инициализированности
источник

m

magras in pro.cxx
Андрей Руссков
ты выделил блок памяти под ноду, в ноде есть место под Key и Value. Проинициализировал в ноде Key, попытался вставить в контейнер, если вставка удалась - проинициализировал Value
Да, наверное, это будет работать. Ноду вроде можно безопасно удалить при ошибке во время инициализации value части.
источник

АР

Андрей Руссков... in pro.cxx
Что забавно - если для ассоциативных контейнеров iterator::operator* будет возвращать не pair<const Key, Value>&, а pair<const Key&, Value&>, то все UB можно было бы обойти
источник

АР

Андрей Руссков... in pro.cxx
а не, это бы сломало захват по mutable ссылке, а-ля
auto& p = *it;
источник

D

Dmitriy in pro.cxx
Андрей Руссков
Что забавно - если для ассоциативных контейнеров iterator::operator* будет возвращать не pair<const Key, Value>&, а pair<const Key&, Value&>, то все UB можно было бы обойти
Меняем ключи в дереве и наслаждаемся происходящим?)
источник

АР

Андрей Руссков... in pro.cxx
const то не пропал, я не настолько дурак чтобы предлагать ломать транзитивность )
источник

D

Dmitriy in pro.cxx
Андрей Руссков
const то не пропал, я не настолько дурак чтобы предлагать ломать транзитивность )
Что-то я смотрю в книгу, вижу...
источник

m

magras in pro.cxx
magras
Да, наверное, это будет работать. Ноду вроде можно безопасно удалить при ошибке во время инициализации value части.
Хотя нет, все не так просто. На сколько я понимаю, будет нарушена гарантия по exception. Чтобы ее восстановить нам нужно будет вернуть ключ назад в аргумент.
источник

m

magras in pro.cxx
То есть возникает тревание nothrow movable на Key.
источник

АР

Андрей Руссков... in pro.cxx
не, ты ключ конструируешь прям в ноде
источник

АР

Андрей Руссков... in pro.cxx
там с исключением может быть только одна беда - деструктор ноды должен понимать вызывать ли деструктор для Value
источник