Буфер chars, unsigned chars или void* - Есть ли у нас противоречия в стандарте C ++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Буфер chars, unsigned chars или void* - Есть ли у нас противоречия в стандарте C ++?

Сообщение Anonymous »

Это продолжение:
Почему UB для передачи char массив в качестве аргумента размещения нового? типа «массив n unsigned char» или типа «массив n std :: byte» ([[cstdddef.syn]), этот массив обеспечивает хранилище для созданного объекта [...]

[basic.types.general#4] , также соответствует: > plackque. /> последовательность n un unsigned char -объектов

В качестве потенциально достоверного представления объекта полного объекта т. char »или« массив n std :: byte », будет неопределенным поведением, для того, чтобы быть не определенным Spec как действительным.

Код: Выделить всё

struct A { ... };
alignas(A) char buf[sizeof(A)];
auto ptr = new (buf) A(...);
Обратите внимание, что вопрос, связанный в начале, задает почему это UB. Я спрашиваю , является ли это < /em> ub?
(еще одно важное отличие в самом коде, чтобы избежать проблем выравнивания и сделать его потенциально определенным, Alignas (a) < /code>, который не появляется в исходном вопросе). < /P>

. хранилище?

Код: Выделить всё

auto buf = ::operator new(sizeof(A), std::align_val_t(sizeof(A)));
auto p = new (buf) A(...); // buf is void*, not unsigned char* nor std::byte*
// ...
p->~A();
::operator delete(buf);
< /code>
На случай, если это UB, означает ли это, что этот пример из спецификации также является UB: < /p>
void* place = operator new(sizeof(Something));
Something* p = new (place) Something();
На случай, если он хорошо определен, почему разница между брюшной буфером с помощью кучи и автоматическим буфером хранения? /> [input.output#iosfwd.syn] - Настройка аргумента шаблона emplate :

Код: Выделить всё

using ostream   = basic_ostream;
using iostream  = basic_iostream;
iStream.Generalí:

Код: Выделить всё

using char_type = charT;
basic_istream& read(char_type* s, streamsize n);
HoStream.GeneralTy:

Код: Выделить всё

using char_type = charT;
basic_ostream& write(const char_type* s, streamsize n);
< /code>
Если char* недопустит для буфера, почему бы не использовать Unsigned char* Здесь? < /p>

 Вопрос 4 - существует ли фактическое различие для представления битов между Char и unsigned char, в стороне или не иметь знакового бита? /> 
Значения, хранящиеся в бессознанных битовых полях и объектах типа Unsigned char, должны быть
с использованием чистой бинарной нотации. < /p>
< /blockquote>
, по-видимому, дифференцирует, в некотором смысле, между Char < /code> и unsigned char < /код>. C ++ имеет одинаковое различие? Если да, то где это сказано в спецификации и как это различие влияет на вопросы от 1 до 3? />   Связанные посты:  
[list]
[*]  Каково значимость массивов std :: byte 
и unsigned char , обеспечивающие хранилище в C ++?

[*] />
[/list]
посты выравнивания, в домене, но не связанных, imho:

[*] nimrod «Кодирующая лаборатория - суббота», когда я не имею никакого использования, я не имею никакого использования, когда я не имею никакого использования. Размещение нового оператора?
Если C ++ 17 и выше гарантирует, что распределители должны поддерживать переизмененные типы, это означает, что мы можем избежать создания типов вручную? Типы?)>

Подробнее здесь: https://stackoverflow.com/questions/796 ... s-in-the-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»