prohíbe la inicialización en clase de miembros estáticos no constantes

Forbids Class Initialization Non Const Static Member

Transferido de: prohíbe la inicialización en clase de miembros estáticos no constantes
Cuando escribí el programa hoy, ocurrió un nuevo error. Bueno, siento que cada vez que programo, puedo encontrar un nuevo problema. Espero con ansias el día en que me cure, jaja. El código de accidente es el siguiente:

|_+_|

Después de la compilación:
imagen
No recuerdo la ubicación de las instrucciones específicas en el libro. Lo revisé en Baidu y sucedió que había una publicación de este tipo en stackoverflow. Creo que la respuesta es muy profesional. Traduzca y regístrelo. Mantener el significado original, estático, constante, integral no se traducirá, creo que todos entienden:




P: ¿Por qué no puedo inicializar miembros estáticos en la clase?



Respuesta adoptada: El estándar C ++ solo permite que se inicialicen datos de enumeración o integrales constantes estáticos dentro de la clase.
Referencia: C ++ 03 9.4.2 Miembros de datos estáticos



§4 Si un miembro de datos estáticos es de tipo enumeración constante o integral, su declaración en la definición de clase puede especificar un inicializador constante que será una expresión constante integral (5.19). En ese caso, el miembro puede aparecer en expresiones constantes integrales. El miembro aún se definirá en un ámbito de espacio de nombres si se utiliza en el programa y la definición del ámbito de espacio de nombres no contendrá un inicializador.

Si un miembro de datos estáticos es de tipo de numeración constante integral o constante, entonces si la declaración en su clase contiene una parte de definición, la parte de definición debe ser una expresión constante integral. En este caso, el miembro puede aparecer en una expresión constante integral. Si este miembro se usa en el programa, se debe aclarar el ámbito de dominio de su espacio de nombres y no se debe incluir el inicializador.

¿Qué es el tipo integral?



bool char wchar_t incluye casos modificados por firmado o no firmado. Conocido colectivamente como tipo integral (entiendo esta oración como el tipo básico en C ++, que se distingue de cadena y matriz), el sinónimo de tipo integral es tipo entero.

Notas a pie de página:
Por lo tanto, las enumeraciones no son integrales, pero las enumeraciones se pueden convertir a int, unsigned int, long, unsigned long.
Área de trabajo (así está escrito en el texto original, probablemente sea el área de rutinas de código):
Puede usar el truco de la enumeración para inicializar la matriz de la clase:

|_+_|

¿Por qué el estándar no permite este comportamiento?
Bjarne explicó:

Una clase se definirá específicamente en un archivo de encabezado y el archivo de encabezado se incluirá en muchas unidades de conversión. Sin embargo, para evitar que las reglas de vinculación se vuelvan demasiado complicadas, C ++ requiere una definición específica para cada objeto. Si C ++ permite la definición en clase de objetos almacenados en la memoria, esta regla se romperá.

¿Por qué son solo estáticos?
const tipos integrales y enumeraciones permitidos In-class Initialization?
¿Por qué solo los tipos integrales constantes estáticos y las enumeraciones se pueden inicializar dentro de la clase?
La respuesta está en ese párrafo de Bjarne. 'C ++ requiere una definición específica para cada objeto. Si C ++ permite que los objetos almacenados en la memoria se definan dentro de la clase, esta regla se romperá '.

Tenga en cuenta que solo los enteros estáticos const se tratarán como constantes en tiempo de compilación. El compilador entiende que tales cambios de números enteros no cambiarán bajo ninguna circunstancia, por lo que el compilador puede realizar optimizaciones y mejoras específicas. El compilador simplemente insertará dichas variables en línea, por lo que ya no las guardará en memoria. Debido a que se eliminaron los requisitos guardados en la memoria, lo que los convierte en una excepción a las reglas que dijo Bjane.

Vale la pena señalar que incluso si se permite que variables como la integral const estática utilicen la inicialización en clase, no se permite obtener la dirección de dichas variables. Una variable solo se puede abordar si tiene una definición fuera de la clase.