У меня такой код:
#include "type_traits"
#include <new>
void foo()
{
std::aligned_storage<10,alignof(long)> storage;
new (&storage) int(12);
}
У меня есть определенное хранилище (длиной 10 байт), и я размещаю new, устанавливая int в это место.
gcc 7.3 выдает следующее предупреждение:
<source>:10:10: warning: placement new constructing an object of type 'int' and size '4' in a region of type 'std::aligned_storage<10, 8>' and size '1' [-Wplacement-new=]
new (&storage) int(12);
Если я не ошибаюсь, это предупреждение неверно. Я что-то упускаю или это предупреждение является ложным?





std::aligned_storage - это признак с вложенным членом type. Этот type имеет правильный размер и правильную ориентацию. Сама черта может не иметь членов данных и, следовательно, получит размер объекта по умолчанию, равный 1.
Итак, исправление простое:
std::aligned_storage<10,alignof(long)>::type storage;
Вы также можете написать
std::aligned_storage_t. Иногда я делал эту ошибку (с другими типами), просто забывая_t. Это может быть довольно сложно обнаружить