Qué miembro del sindicato se activa después de la colocación nueva

En relación con este código:

#include <string>

int main()
{
    union u {
        u() { i = 0; }
        ~u() {}

        int i;
        std::string s1;
        std::string s2;
    } u;

    new (&u) std::string{};
}

[intro.object] / 2 dice qu

Objects puede contener otros objetos, llamados subobjects. Un subobject puede ser un subobject miembro ([class.mem]), un subobject de clase base ([class.derived]) o un elemento de matriz. Un objeto que no es un subobjeto de ningún otro objeto se llama un objeto completo. @ Si se crea un objeto en el almacenamiento asociado con un subobjeto miembro o elemento de matriz e (que puede estar o no dentro de su vida útil), el objeto creado es un subobjeto del objeto que contiene e si:
: La vida útil del objeto que contiene e ha comenzado y no ha terminado, y
: El almacenamiento para el nuevo objeto se superpone exactamente a la ubicación de almacenamiento asociada con e, y
: El nuevo objeto es del mismo tipo que e
(ignorando la calificación cv).

No hay ningún requisitocóm se crea un objeto en el almacenamiento asociado con un subobjeto miembro. El código no tiene que nominar el subobject en el argumento del operador address-of si el subobject es miembro de una unión de diseño estándar o el primer miembro de un objeto de clase no union. Es suficiente obtener la dirección del objeto que contiene para designar el almacenamiento del subobjeto miembro en tales casos.

«No hay ningún requisitocóm se crea un objeto », entre otras cosas, significa que el puntero asignado a la ubicación nueva no tiene quepunt al subobjeto. Principalmente porque no podría haber ningún objeto al que señalar (nota, la [intro.object] / 2 no requiere que subobject esté vivo). En la lista de correo de discusión estándar se le preguntó, dado un objetox de tipostruct A { unsigned char buf[1]; };, ¿hay alguna diferencia entrenew (&x) A{} ynew (x.buf) A{}? Yla respuest no, en ambos casos,x.buf haríaproveer almacenamiento paraA{}. Porqu

La redacción de [intro.object] y [basic.life] se refiere a la dirección de almacenamiento representada por un puntero, no al objeto al que apunta.


[class.union] / 1 jura que «a lo sumo, uno de los miembros de datos no estáticos de un objeto de tipo de unión puede estar activo en cualquier momento».

Qué se activó en el código anterior,s1 os2?

Respuestas a la pregunta(1)

Su respuesta a la pregunta