Почему [[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.e;
auto p2 = new (&a.c) char;
(void)p2->e; // OK.
(void)*p1;   // 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
Ответить

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

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

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

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

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