2011-04-05 9 views

Respuesta

21

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

Búsqueda allí primero antes de preguntar sobre C++ 0x ofrece explicaciones sobre los defectos.

uniones restringidas

En estándar de C++ existen restricciones sobre qué tipos de objetos pueden ser miembros de un sindicato. 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 las uniones se usen en más tipos en los que no estaban permitidos para usarse en adelante. [6] Este es un ejemplo sencillo 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 cualquier código existente, ya que sólo se relajan normas actuales.

8

No es 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 que no sean POD en una unión. Sin embargo, usted será responsable de construir y destruir explícitamente a ese miembro.

De N3242:

[Ejemplo: Considere un objeto u de un tipo de unión U que tiene los datos no estáticos m miembros 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 declaran o heredan funciones virtuales), el miembro activo de u puede cambiarse de forma segura de la m a la n utilizando el destructor y el nuevo operador de ubicación de la siguiente manera:
um ~ METRO();
nuevo (& u.n) N;
-end ejemplo]

No

una característica ampliamente útil, la OMI.

1

Extiende las uniones para permitir cualquier tipo, no solo "datos antiguos simples", ofreciéndole más flexibilidad para almacenar diferentes tipos de datos en la misma ubicación sin recurrir a hackers con puntero manual.

El precio que paga por esto es que tiene que hacer una contabilidad cuidadosa. Con una simple asignación antigua de unión de datos fue suficiente para cambiar el "tipo actual" y leer el tipo incorrecto probablemente daría como resultado datos etiquetados pero no mucho más que eso. Con un uninion de datos antiguos no simple, debe realizar un seguimiento del tipo actual y llamar manualmente a los constructores y destructores de corect para cambiar el tipo actual y para limpiar correctamente las cosas al destruir la unión como un todo.Si intenta leer o escribir el tipo de escritura incorrecta, es probable que sucedan cosas

Cuestiones relacionadas