uniones programas palabras example con c++ c++11 unions

programas - union c++



¿Qué son los sindicatos sin restricciones propuestos en C++ 11? (3)

Reúno las unrestricted unions como una de las funciones que se presentan en C ++ 11. ¿Alguien puede explicar la semántica detrás de esto y las ventajas que proporciona?


Expande las uniones para permitir cualquier tipo, no solo "datos antiguos", lo que le brinda más flexibilidad para almacenar diferentes tipos de datos en la misma ubicación sin tener que recurrir a la piratería manual.

El precio que pagas por esto es que tienes que hacer un mantenimiento cuidadoso de los libros. Con una simple y antigua asignación de unión de datos fue suficiente para cambiar el "tipo actual" y la lectura del tipo incorrecto podría dar como resultado datos con un rótulo incrustado, pero no mucho más que eso. Con una unidad de datos antigua no simple, debe hacer un seguimiento del tipo actual y llamar a los constructores y destructores correctos manualmente para cambiar el tipo actual y limpiar las cosas correctamente al destruir la unión en su totalidad. Si intenta leer o escribir el tipo de retorcido, es probable que ocurran cosas malas


Hay una explicación en Wikipedia: http://en.wikipedia.org/wiki/C%2B%2B0x#Unrestricted_unions

Busque allí antes de preguntar sobre las explicaciones de las características de C ++ 0x.

Uniones sin restricciones

En el Estándar C ++ hay restricciones sobre qué tipos de objetos pueden ser miembros de una unión. Por ejemplo, las uniones no pueden contener ningún objeto que defina un constructor no trivial. C ++ 0x aliviará algunas de estas restricciones, permitiendo que se usen uniones en más tipos en los que anteriormente no se les permitía usar. [6] Este es un ejemplo simple de una unión permitida en C ++ 0x:

//for placement new #include <new> struct Point { Point() {} Point(int x, int y): x_(x), y_(y) {} int x_, y_; }; union U { int z; double w; Point p; // Illegal in C++; point has a non-trivial constructor. // However, this is legal in C++0x. U() { new( &p ) Point(); } // No nontrivial member functions are //implicitly defined for a union; // if required they are instead deleted // to force a manual definition. };

Los cambios no romperán ningún código existente, ya que solo relajan las reglas actuales.


No es nada más que las antiguas uniones que siempre hemos tenido, un objeto que contiene un miembro a la vez, de tipo variable.

El cambio es solo que ahora puede almacenar tipos no POD en una unión. Sin embargo, usted será responsable de construir y destruir explícitamente ese miembro.

Desde N3242:

[Ejemplo: considere un objeto u de un tipo U de unión que tiene miembros de datos no estáticos m de tipo M y n de tipo N. Si M tiene un destructor no trivial y N tiene un constructor no trivial (por ejemplo, si declarar o heredar funciones virtuales), el miembro activo de u se puede cambiar de forma segura de m a n utilizando el destructor y la colocación del nuevo operador de la siguiente manera:
um ~ M ();
nuevo (& u.n) N;
—En ejemplo]

No es una característica muy útil, OMI.