Tengo dificultades para comprender el siguiente párrafo citado de cppreference sobre el constructor trivial predeterminado. He buscado stackoverflow pero aún no obtuve una respuesta clara. Así que por favor ayuda.
Un constructor predeterminado trivial es un constructor que no realiza ninguna acción. Todos los tipos de datos compatibles con el lenguaje C (tipos POD) son trivialmente construibles por defecto. Sin embargo, a diferencia de C, los objetos con constructores triviales predeterminados no se pueden crear simplemente reinterpretando el almacenamiento adecuadamente alineado, como la memoria asignada con std :: malloc: position-new es necesaria para introducir formalmente un nuevo objeto y evitar un posible comportamiento indefinido.
Específicamente, si el constructor trivial predeterminado no hace nada, ¿por qué no podemos reinterpretar el almacenamiento y pretender que hay un objeto con el tipo dado? ¿Podría proporcionar algunos ejemplos del posible comportamiento indefinido que esto causaría?
fuente
*reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;
. C ++ tiene un concepto de objetos y vidas de objeto, especificado en la máquina abstracta, y el hecho de que no haya instrucciones de CPU para crear un objeto desde el almacenamiento no significa que no haya diferencia en la máquina abstracta.Respuestas:
P0593R5 da este ejemplo:
y explica:
En la práctica, esto funciona y la situación de UB se considera más como un defecto en el estándar que cualquier otra cosa. Todo el objetivo del documento es proponer una forma de solucionar ese problema y casos similares sin romper otras cosas.
fuente
Por razones de "pureza".
La alternativa y el status quo real era que cada región de almacenamiento contendría todos los objetos que se ajustan en ese almacenamiento, al mismo tiempo. Algunos miembros del comité están incómodos con el statu quo y mucha gente temía la idea de tener infinitos objetos en el mismo lugar (en un estado virtual no inicializado).
Nadie ha podido mostrar un problema lógico al tener infinitos objetos en una región de almacenamiento.
Como tenían diferentes secciones de la norma que decían cosas contradictorias, los miembros del comité decidieron tomarse en serio una de las peores partes de la norma.
Además, el uso de literales de cadena no está estrictamente permitido, si realmente se toma en serio esa parte del estándar.
fuente
type_info
objetos. ¿Has informado sobre los literales de cadena?