Como P0593 se ha aceptado la creación implícita de objetos para la manipulación de objetos de bajo nivel , los objetos ahora se pueden crear implícitamente en C ++ 20.
Específicamente, la redacción introducida por la propuesta permite que ciertas operaciones (como std::malloc
) creen y comiencen automáticamente la vida útil de los objetos de ciertos tipos, los llamados tipos de vida útil implícita , si la introducción de tales objetos ocasionaría que un programa con un comportamiento indefinido comportamiento definido Ver [intro.object] / 10 .
El borrador ahora establece además que si hay múltiples conjuntos de tales objetos que podrían crearse implícitamente para dar al programa un comportamiento definido, no se especifica cuál de estos conjuntos se crea. (La oración relevante no parece estar presente en la última revisión de la propuesta a la que pude acceder, R5, pero está en el borrador del compromiso).
¿Existe realmente un programa para el cual esta elección de conjunto de objetos creado implícitamente sea observable? En otras palabras, ¿existe un programa con un comportamiento definido, pero no especificado, a través de esta nueva regla, de modo que sea posible inferir a partir de la salida qué conjuntos de tipos de objetos implícitos (de más de uno posible) se crearon?
¿O fue esta oración simplemente destinada a aclarar la ejecución del programa en la máquina abstracta (sin impacto observable)?
fuente
std::malloc
), de lo contrario, obtendrá problemas con la definición siendo recursivamente dependiendo del futuro.Respuestas:
Tomemos el ejemplo en el estándar y cambiémoslo un poco:
Anteriormente, solo había un conjunto de objetos válidos que podían crearse implícitamente en ese almacenamiento: tenía que ser exactamente uno
X
. Pero ahora, tenemos almacenamiento para dosX
s, pero solo escribimos en uno de ellos, y nada en este programa toca el resto de los bytes. Así que hay muchos conjuntos diferentes de objetos que podrían crearse implícitamente: tal vez dosX
s, tal vez anX
y dosint
s, tal vez anX
y ochochar
s, ...No es observable qué conjunto se crea, porque si hubiera observaciones reales, eso reduciría las posibilidades a solo aquellos conjuntos que fueran válidos. Si hiciéramos algo así,
p[1]->a = 3
entonces el universo de posibilidades se derrumba a solo el que tiene dosX
s.En otras palabras, múltiples conjuntos de objetos creados implícitamente son posiblemente solo cuando no hay suficientes observaciones en el programa para distinguir su validez. Si hubiera una manera de distinguir, entonces, por definición, no serían todos válidos.
fuente
char
,unsigned char
ostd::byte
? Supongo que también podría existir un objeto de cualquier tipo que se pueda copiar trivialmente.X
objeto.