предоставлении хранилища массивом из unsigned char (или std::byte) на самом деле элементы массива не умирают, так как на их месте создаётся object representation, которое является массивом unsigned char? И по сути происходит прозрачная замена
это попытка изобрести placement new?
Не совсем, я пытаюсь понять, можно ли делать вот так alignas(alignof(T)) unsigned char buffer[sizeof(T)]; auto ptr = new (buffer) T; for (auto c : buffer) { ... } или же так делать UB и нужно for (size_t i = 0; i < sizeof(T); ++i) { auto c = reinterpret_cast<unsigned char *>(ptr)[i]; ... }
1) вы сами себе противоречите, одновременно говоря, что элементы массива не умирают и что происходит прозрачная замена. второе действительно имеет место: storage отдельных uchar'ов переиспользуется для uchar'ов представления объекта. поэтому я и считаю, что buffer[i] после placement-new это корректное выражение 2) представление объекта является последовательностью (sequence) uchar'ов, а не массивом. это существенное отличие
1) да, приврал немного, не умирают могут всё еще быть использованы 2) раз последовательность отдельных элементов, можно ли считать что каждый элемент заменяет соответствующий подобъект массива по правилу http://eel.is/c++draft/basic.memobj#intro.object-2 ?
не уверен, потому что если вы переиспользуете std::byte, последнее условие в том пункте удовлетворено не будет. зачем объяснять это окольным путем через подобъекты, когда есть переиспользование storage и basic.lval#11.3?
Постараюсь полный путь моих рассуждений привести. Есть массив с живыми элементами unsigned char (только что выделили). Используем его для размещения по правилам предоставления хранилища. Сам массив не умирает, но что насчет его элементов (то есть его подобъектов)? Если они умирают и не происходит прозрачной замены, выражения вида buffer, *buffer, buffer + i, buffer[i] являются указателями/выражениями, ссылающимися на исходные элементы, которые умерли, и в соответствии с http://eel.is/c++draft/basic.memobj#basic.life-6, http://eel.is/c++draft/basic.memobj#basic.life-7 происходит UB. Но если происходит прозрачная замена, то всё нормально. Меня интересует подтверждение стандартом, что именно происходит и в каком порядке.
Артем, в который раз прошу объяснить мне, нафига тебе такое надо? Я за хер знает сколько лет промышленной карьеры такое не делал никогда...
Таким образом я постигаю С++, чтобы "преисполниться")
Да это все не нужно никому, в с++ куча всего что постигать надо. Ты уже все постиг остальное? Шаблоны, ООП, полиморфизм, множественное наследование, перегрузку операций?
Как по мне, обучение процесс итерационный. Поверхностно прошел, раза 2, без практики конечно забывается, но как только начинаешь писать код, основы быстро вспоминаются. Но у меня плохо с практикой, прошел курс на курсере от яндекса, примеры хорошие, но если нет тестирующей системы, мне сложно что-то делать самостоятельно. Поэтому открыл для себя процесс обучения снизу вверх, когда сначала изучаешь во всей красе все возможности языка, а после уже, читая про более высокоуровневые абстракции думаешь: "Ха, здесь можно применить вот этот механизм языка, вот в этом примере я бы сделал так, тут неоптимально. А, так вот как это работает..." и т.д.
Желаю тебе терпения и как его вознаграждение - успехов на этом длинном и извилистом пути.
1) вы создаете массив, пусть, std::byte. начинается время жизни как массива, так и его элементов 2) потом массив provides storage для нового объекта. время жизни массива не заканчивается, но заканчивается время жизни его элементов, потому что их storage переиспользуется для uchar'ов представления нового объекта. условия прозрачной замены при этом не соблюдаются 3) после этого buffer[i] это вполне себе валидное glvalue для работы с uchar'ами представления нового объекта, потому что это явно разрешено basic.lval#11.3
buffer[i] Но не противоречит ли это http://eel.is/c++draft/basic.memobj#basic.life-6 http://eel.is/c++draft/basic.memobj#basic.life-7 ?
перечитайте внимательно условия в начале этих пунктов
Обсуждают сегодня