Подтвердить что ты не робот

Является ли размещение новым юридически необходимым для помещения int в массив char?

Похоже, что существует некоторая договоренность о том, что вы не можете willy nilly point (int *) в массив char из-за правил псевдонимов С++.

Из этого другого вопроса - Общее хранилище char [] и избегающего строгого сглаживания UB - кажется, что ему разрешено ( ) используйте хранилище через новое размещение.

alignas(int) char buf[sizeof(int)];

void f() {
  // turn the memory into an int: (??) from the POV of the abstract machine!
  ::new (buf) int; // is this strictly required? (aside: it obviously a no-op)

  // access storage:
  *((int*)buf) = 42; // for this discussion, just assume the cast itself yields the correct pointer value
}

Итак, это выше законный С++ и является новым местом размещения, необходимым для того, чтобы сделать его законным?

4b9b3361

Ответ 1

Да, требуется размещение new, иначе вы нарушите строгий псевдоним (присваивание access).

Является ли выше законным? Почти (хотя он будет работать практически во всех реализациях). Указатель, созданный вами при трансляции, не указывает на объект, потому что массив (теперь уничтоженный) и объект int не являются pointer-interconvertible; используйте std::launder((int*)buf) или еще лучше, используйте возвращаемое значение размещения new.

Ответ 2

*((int*)buf) = 42;

записывает int с int lvalue, поэтому в первую очередь проблема с псевдонимом отсутствует.