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

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

Сообщение Anonymous »

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

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

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

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

struct Empty {};

struct B {
const int                   n = {};
[[no_unique_address]] Empty e = {};
char                        c = {};
};

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

объект o 1 прозрачно заменяется на объект
e sub> em> . o 2 < /sub> < /em> является потенциально опровергающим субобектом. Subobjects?
Какие плохие последствия последуют без этого ограничения?>

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

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