Я утверждаю что этот код содержит ub до 20 стандарта, если начать работать с объектами not isComplex так как их время жизни не начиналось и как следствие произойдет нарушение правил алиасинга.
Если нужно больше контекста - это код вектора из qt. Используется для инциализации элементов например при resize. Там есть еще связанный код, но думаю что можно ограничится обсуждением этого.
а какие аргументы против? http://eel.is/c++draft/cstring.syn#3.sentence-2 — memset тут нет http://eel.is/c++draft/basic.life#4.sentence-1
так он и после 20 остается UB объектов-то нет
20ый стандарт там может спасти, например, если аллокатор выделяет память через malloc, что неявно создаст объекты. Но да, этого нет в кусочке кода выше.
вызов которого где-то за пределами кода, на который вы сослались?
Начало вот здесь: https://t.me/ProCxx/466755
если все типы, для которых справедливо !isComplex == true, входят в множество implicit-lifetime типов, то соглашусь, что поведение DefaultConstruct определено в 20
при условии, что память выделяется функцией, которая implicitly create objects
Все же это зависит от реализации аллокатора. Я не разбираюсь в qt, но полагаю что пользователь может менять аллокатор и это значит что корректость кода в 20 стандарте будет зависеть от переданного аллокатора.
да, оговорился ниже
Обсуждают сегодня