Почему [[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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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