C ++ 11 permite la inicialización en clase de miembros no estáticos y no constantes. ¿Qué cambió?

Antes de C ++ 11, solo podíamos realizar la inicialización en clase en miembros const constantes de tipo integral o de enumeración.Stroustrup discute esto en sus preguntas frecuentes de C ++, dando el siguiente ejemplo:

class Y {
  const int c3 = 7;           // error: not static
  static int c4 = 7;          // error: not const
  static const float c5 = 7;  // error: not integral
};

Y el siguiente razonamiento:

Entonces, ¿por qué existen estas restricciones inconvenientes? Normalmente, una clase se declara en un archivo de encabezado y un archivo de encabezado se incluye normalmente en muchas unidades de traducción. Sin embargo, para evitar reglas de vinculadoras complicadas, C ++ requiere que cada objeto tenga una definición única. Esa regla se rompería si C ++ permitiera la definición en clase de las entidades que necesitaban ser almacenadas en la memoria como objetos.

Sin embargo, C ++ 11 relaja estas restricciones, permitiendo la inicialización en clase de miembros no estáticos (§12.6.2 / 8):

En un constructor no delegante, si un miembro de datos no estático o una clase base dados no son designados por unmem-initializer-id (incluyendo el caso donde no haymem-initializer-list porque el constructor no tieneinicializador ctor) y la entidad no es una clase base virtual de una clase abstracta (10.4), entonces

Si la entidad es un miembro de datos no estáticos que tiene unainicializador de corsé o igual, la entidad se inicializa como se especifica en 8.5;de lo contrario, si la entidad es un miembro variante (9.5), no se realiza ninguna inicialización;de lo contrario, la entidad está inicializada por defecto (8.5).

La Sección 9.4.2 también permite la inicialización en clase de miembros estáticos no constantes si están marcados con elconstexpr especificador

Entonces, ¿qué pasó con las razones de las restricciones que teníamos en C ++ 03? ¿Simplemente aceptamos las "reglas de vinculadoras complicadas" o cambiamos algo más que hace que esto sea más fácil de implementar?

Respuestas a la pregunta(3)

Su respuesta a la pregunta