Co sprawia, że członek związku jest aktywny?Co sprawia, że członek związku jest aktywny?
Przeczytałem rozdział 9.5 standardu C++ 14 (ten o związkach), ale nie znalazłem jednoznacznej odpowiedzi na pytanie, co sprawia, że członek związku jest aktywny.
Jest uwaga:
Ogólnie, trzeba używać wyraźnych połączeń spalające i rozmieszczenie nowych operatorów zmienić aktywnym członkiem Unii.
Tak na przykład,
union U {
int i;
short s;
} u;
new(&u.i) int(42);
porządku, pośrednictwa nowe zmiany aktywnym członkiem, to jasne. Ale zwykle nie używamy nowego miejsca podczas pracy z typami z trywialnymi konstruktorami.
Czy operator=
zmienia aktywny element bez UB?
u.i = 42;
Tutaj, operator=
zadzwonił na niezbudowany obiekt. Czy jest dobrze zdefiniowany?
Co z tym?
struct A {
int i0;
int i1;
};
union U {
A a;
short s;
} u;
Co sprawia a
być aktywnym członkiem u
? Czy wystarczająca jest wystarczająca ilość pamięci?
u.a.i0 = 42;
u.a.i1 = 99;
Co jeśli piszę:
u.a.i0 = 42; // supposedly this doesn't change the active member to a, as i1 isn't set
int x = u.a.i0; // is it fine to read from a.i0? a is not an active member supposedly
Po u.a.i0 = 42;
, aktywny członek nie jest zmieniany na a
(chyba), więc jest to do zrobienia int x = u.a.i0;
UB?
Czy C++ 17 poprawia opis aktywnych członków?
„Tutaj operatora' = 'nazwie na zasadzie niezabudowana obiekt "jesteś pewien? To POD, więc wydaje się dobrze. – BartoszKP
Definicja laika jest taka, że jest to element, na który ostatnio napisano. Ale nie mogę znaleźć żadnego uzasadnienia tego w standardzie. – SergeyA
@BartoszKP: cóż, to DynamicType to na pewno (?) Nie 'int', więc ... nie wiem :) – geza