170 похожих чатов

Есть допустим у меня union U { int x;

T arr[10];
};

и сейчас активен x. При этом T не имеет дефолтного конструктора. Есть ли легальный сконструировать какое-то количество элементов на префиксе arr? Или хотя бы сконструировать все 10 элементов за раз — уже было бы неплохо.

Ну то есть я могу конечно в цикле сделать условно std::construct_at(arr + i, args...), но непонятно, почему активный мембер юниона при этом сменится на arr. В стандарте активный мембер определён как тот, у которого начался, но не закончился лайфтайм.

Соответственно, если верить в то, что это всё-таки легально, где-то в стандарте должно быть сказано, что при такой операции arr начнёт лайфтайм (вероятно, как-то связано с тем что массивы implicit-lifetime), но я не нашёл.

Если же это и правда нелегально, то непонятно, а как это обходить, кроме как отказываться от юниона и прибегать к вариантам вида std::byte[]. Но то что с ним можно — я и так знаю, интересен именно случай с union.

14 ответов

20 просмотров

Это нелегально

А оно вообще скомпилируется без дефолтного конструктора?

rept1d-Illuminati Автор вопроса
Ilya Zviagin
Это нелегально

и даже явно нет никакого способа переключить активный мембер?

Boris Usievich
А оно вообще скомпилируется без дефолтного констру...

Наверняка он имел в виду что тип ты не не имеет дефолтного конструктора, а имеет тривиальный дефолтный конструктор

rept1d-Illuminati Автор вопроса
rept1d Illuminati
и даже явно нет никакого способа переключить актив...

Удалить старый объект завершив его время жизни и создать новый объект начав его время жизни

rept1d-Illuminati Автор вопроса
Ilya Zviagin
Да есть есть

ну если только deleted ты классифицируешь как "есть"

rept1d-Illuminati Автор вопроса
Ilya Zviagin
Удалить старый объект завершив его время жизни и с...

ну вот вопрос как раз в том, как начать время жизни массива, не начиная времени жизни его элементов

rept1d-Illuminati Автор вопроса
Boris Usievich
Это выглядит странным.

почему же? это происходит при расположении объектов в памяти, выделенной через ::operator new или в std::byte[]

rept1d Illuminati
почему же? это происходит при расположении объекто...

для объектов выделенных через new вызывается конструктор, а вы хотите, чтобы массив был, а его подобъектов не было

rept1d-Illuminati Автор вопроса
Boris Usievich
для объектов выделенных через new вызывается конс...

для каких объектов, выделенных через new?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта