O C ++ 11 permite a inicialização em classe de membros não estáticos e não-constantes. O que mudou?

Antes do C ++ 11, só poderíamos executar a inicialização na classe em membros estáticos constantes do tipo integral ou de enumeração.Stroustrup discute isso em seu FAQ C ++, dando o seguinte exemplo:

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

E o seguinte raciocínio:

Então, por que essas restrições inconvenientes existem? Uma classe é normalmente declarada em um arquivo de cabeçalho e um arquivo de cabeçalho é normalmente incluído em várias unidades de tradução. No entanto, para evitar regras de vinculador complicadas, o C ++ exige que cada objeto tenha uma definição exclusiva. Essa regra seria quebrada se o C ++ permitisse a definição em classe de entidades que precisavam ser armazenadas na memória como objetos.

No entanto, o C ++ 11 relaxa essas restrições, permitindo a inicialização em classe de membros não estáticos (§12.6.2 / 8):

Em um construtor não delegante, se um dado membro de dados não estático ou classe base não for designado por ummem-initializer-id (incluindo o caso em que não hámem-inicializador-list porque o construtor não temIniciador-ctor) e a entidade não é uma classe base virtual de uma classe abstrata (10.4), então

se a entidade for um membro de dados não estático que tenha uminicializador de chave ou igual, a entidade é inicializada conforme especificado em 8.5;caso contrário, se a entidade for um membro variante (9.5), nenhuma inicialização será executada;caso contrário, a entidade será inicializada por padrão (8.5).

A Seção 9.4.2 também permite a inicialização em classe de membros estáticos não-constantes, se eles estiverem marcados comconstexpr especificador.

Então, o que aconteceu com as razões para as restrições que tivemos no C ++ 03? Simplesmente aceitamos as "regras de linker complicadas" ou alguma outra coisa mudou para tornar isso mais fácil de implementar?

questionAnswers(3)

yourAnswerToTheQuestion