Почему [[no_unique_address]] члены не прозрачно заменяются?C++

Программы на C++. Форум разработчиков
Anonymous
Почему [[no_unique_address]] члены не прозрачно заменяются?

Сообщение Anonymous »

В классическом разговоре (в) Полное руководство по времени жизни объекта C ++ от Джонатана Мюллера, есть полезное руководство следующим образом:

Q: Когда мне нужно использовать STD :: rEN wanning? of:
  • const Heap объекты,
  • базовые классы, или
  • Код: Выделить всё

    [[no_unique_address]]
    участники.
Первая пуля очевидна, но две другие пули немного трудно понять.

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

struct Empty {};

struct A {
[[no_unique_address]] Empty e = {};
char                        c = {};
};

int main() {
auto a  = A{};
auto p1 = &a;
auto p2 = new (p1) A{};
(void)p2->c; // OK.
(void)p2->e; // OK.
(void)p1->c; // OK.
(void)p1->e; // UB due to bullet 3.
}
UB изначально обусловлен это стандартное правило C ++ ① :

Объект o является o o /> o 2 if ... и ни o 1 и o 2 является потенциально оверновленным subobject.


Почему стандарт C ++ налагает такое особое ограничение на потенциально ограбления субобъектов? />
① < /sup> Правило охватывает как пулю 2 (в случае пустой базовой оптимизации), так и пули 3. < /p>

Подробнее здесь: https://stackoverflow.com/questions/797 ... eplaceable

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