c++ - método - ¿Por qué una clase con referencias no se adhiere a standard_layout?
en c# qué es método (3)
El punto del concepto del estándar C ++ de una clase de disposición estándar es que se puede acceder de manera confiable a una instancia de tal clase como o copiarla a bytes, lo que, como señala el estándar C ++ 11 en su §9 / 9, hace que clase
” Útil para comunicarse con código escrito en otros lenguajes de programación
Sin embargo, el estándar de C ++ no requiere una referencia para usar el almacenamiento. No es un objeto. No puedes tomar su dirección. Por lo tanto, no se puede copiar (de manera confiable) a bytes, o acceder a ellos como bytes. Y, por lo tanto, no es compatible con la noción de clases de diseño estándar.
En lo formal,
C ++ 11 §9 / 7:" Una clase de diseño estándar es una clase que:
- no tiene miembros de datos no estáticos de tipo clase de diseño no estándar (o matriz de tales tipos) o referencia,
Ejecutando el siguiente código:
#include <iostream>
#include <type_traits>
struct s_ref {
int &foo;
};
struct s_ptr {
int *foo;
};
int main(int argc, char *argv[])
{
std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
return 0;
}
resultados en:
s_ref is_standard_layout:0
s_ptr is_standard_layout:1
Basado en los usos del diseño estándar (es decir, "los tipos de diseño estándar son útiles para comunicarse con código escrito en otros lenguajes de programación"), esto tiene sentido, pero no estoy seguro de cuál es la regla que se infringe:
Una clase de diseño estándar es una clase (definida con clase, estructura o unión) que:
No tiene funciones virtuales ni clases de base virtual.
tiene el mismo control de acceso (privado, protegido, público) para todos sus miembros de datos no estáticos.
o no tiene miembros de datos no estáticos en la clase más derivada y, como máximo, una clase base con miembros de datos no estáticos, o no tiene clases base con miembros de datos no estáticos.
su clase base (si existe) es también una clase de diseño estándar.
Y, no tiene clases base del mismo tipo que su primer miembro de datos no estáticos.
Edición : la cita es de: http://www.cplusplus.com/reference/type_traits/is_standard_layout/ , pero http://en.cppreference.com/w/cpp/concept/StandardLayoutType también es similar.
En n4140 puedes leer:
9 clases (7.1)
Una clase de diseño estándar es una clase que:
- no tiene miembros de datos no estáticos de tipo clase de diseño no estándar (o matriz de tales tipos) o referencia ,
[editar]
Para obtener más información sobre por qué la clase con referencias no es un diseño estándar, lea esta excelente respuesta: Diseño y referencias estándar de C ++
No sé de dónde sacó esa cita, pero omite la regla relevante de la norma.
(N3337) [class]/7:
una clase de diseño estándar es una clase que:- no tiene miembros de datos no estáticos de tipo clase de diseño no estándar (o matriz de tales tipos) o referencia,
- no tiene funciones virtuales (10.3) ni clases base virtuales (10.1),
- tiene el mismo control de acceso (Cláusula 11) para todos los miembros de datos no estáticos,
- no tiene clases base de diseño no estándar,
- no tiene miembros de datos no estáticos en la clase más derivada y, como máximo, una clase base con miembros de datos no estáticos, o no tiene clases base con miembros de datos no estáticos, y
- no tiene clases base del mismo tipo que el primer miembro de datos no estáticos.108