[Примечание 1: Нестатический член данных может поделиться адресом другого нестатического члена данных или базового класса, а любая padding, которые обычно будут вставлены в конце объекта, можно повторно используется в качестве хранилища для других членов < />. Примечание]
(Bold Mine)
Поскольку единственный нормативный эффект no_unique_address делает объект , потенциально оверлепия , какого базового классов автоматически, те же эффекты должны применяться к базовым классам. [intro.object] /10 < /code> < /p>
, если объект не является бит-полем или субобектом нулевого размера, адрес этого объекта-это адрес первого байта, который он занимает. размер и они разных типов; в противном случае, они имеют различные адреса и разъединенные байты хранилища .
Это, казалось бы, позволяет перекрывать только если один из объектов имеет ноль (не является потенциально-защищенным и пустым). Для перекрытия: запустить на gcc.godbolt.org
Код: Выделить всё
struct A
{
int x;
short y;
};
struct B
{
short b;
};
struct C : A, B {};
struct D
{
[[no_unique_address]] A a;
[[no_unique_address]] B b;
};
// Those assertions pass, but I expected the size to be `sizeof(int) * 2` instead.
static_assert(sizeof(C) == sizeof(int) * 3);
static_assert(sizeof(D) == sizeof(int) * 3);
For any object (other than a potentially-overlapping subobject) of trivially copyable type T, ... the underlying bytes ... can be copied into an Массив char ...
(жирный шахта)
Если только пустые объекты могут перекрываться, то неясно, почему он запрещает все потенциально обертывания объектов, а не только пустые. Могут ли не пустые потенциально-перекрывающиеся объекты фактически перекрываться, и есть ли способ сделать компиляторы делать это без расширений? Сюжет сгущается: < /p>
Допускается ли это повторное использование хвостовой прокладки? до. Возможно, регрессия?
Подробнее здесь: https://stackoverflow.com/questions/728 ... -other-bas