Recopilo unrestricted unions
como una de las funcionalidades presentadas en C++ 11. ¿Puede alguien explicar la semántica detrás de esto y las ventajas que proporciona?¿Qué son las Uniones no restringidas propuestas en C++ 11?
Respuesta
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.
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:
No[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]
una característica ampliamente útil, la OMI.
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
- 1. ¿Cuáles son las características propuestas más útiles de C1X?
- 2. ¿Los contenedores estándares C++ 11 son "definitivos"?
- 3. C++ 11: ¿En qué orden se destruyen las capturas lambda?
- 4. ¿Cuáles son las diferencias entre -std = C++ 11 y -std = gnu ++ 11?
- 5. ¿Qué significa thread_local en C++ 11?
- 6. No hay propuestas predeterminadas en Eclipse Juno
- 7. ¿Qué son las colecciones genéricas en C#?
- 8. Symfony2 No se redirigir en áreas restringidas
- 9. ¿Entiendo mal las uniones?
- 10. C++ 11: rbegin No miembro()/rend() Funciones
- 11. C++: ¿uniones con métodos?
- 12. ¿Por qué las uniones anónimas globales deben declararse como estáticas?
- 13. ¿Por qué las funciones lambda en C++ 11 no tienen función <> tipos?
- 14. ¿Qué significa esta construcción C++/C++ 11?
- 15. ¿Qué estándares permiten estructuras anónimas y uniones en C y C++?
- 16. ¿Qué son las etiquetas de documentación C#?
- 17. C++ 11 future_status :: diferida no
- 18. Por qué las propiedades no son declarables en las interfaces
- 19. ¿Qué son [] en C#?
- 20. ¿Cuáles son los buenos casos de uso para las tuplas en C++ 11?
- 21. C++ 11 Atomics. ¿Por qué esta compilación, pero no enlace?
- 22. ¿Por qué las interfaces no son [Serializable]?
- 23. ¿Por qué C++ 11 tienen `` make_shared` pero no make_unique`
- 24. las plantillas de expresión y C++ 11
- 25. ¿Cuáles son las diferencias entre la inferencia tipo de Scala y C++ 11?
- 26. LINQ to Entities ToString() - ¿Ninguna de las soluciones propuestas funciona?
- 27. ¿Por qué no podemos usar uniones externas en CTE recursivo?
- 28. Delegado en C++ 11
- 29. ¿Por qué C++ 11 no admite estructuras anónimas, mientras que C11 sí?
- 30. No coincide con C++ 11 expresiones regulares