Entre o padrão C++98 e o padrão C++03 , foi feita uma mudança interessante:
struct S {
int S;
};
Este código é válido em C++03 e versões mais recentes, mas estava mal formado em C++98. Especificamente, o [class.mem] parágrafo 13 proibiu todos os membros de dados de terem o mesmo nome da classe em C++98, mas esta regra foi flexibilizada para que, se não houver um construtor declarado pelo usuário, você possa ter um construtor não estático membro de dados com o mesmo nome.
Qual é a motivação por trás disso? Que caso de uso importante é coberto por isso que justificaria a revisão do padrão?
Isto é do DR80 . Parafraseando,
static
originalmente deveria estar em conformidade com C, mas entre os documentos de trabalho de maio de 96 e setembro de 96 o padrão foi alterado estatic
removido. O C++ 03 reverteu esse erro da linguagem por meio do relatório de defeitos.A motivação por trás do relaxamento da regra referente aos membros de dados terem o mesmo nome da classe no C++ 03 em comparação com o C++ 98 foi centrada principalmente em fornecer maior flexibilidade e conveniência para os desenvolvedores.
No C++ 98, a restrição estava em vigor para evitar possíveis confusões e ambiguidades no código. Permitir que os membros dos dados tenham o mesmo nome da própria classe pode causar confusão, especialmente para aqueles que são novos na linguagem ou quando mantêm grandes bases de código.
No entanto, à medida que o C++ evoluiu, os desenvolvedores encontraram certos casos de uso em que poderia ser benéfico ter um membro de dados com o mesmo nome da classe. Um desses cenários é ao implementar certos padrões de design ou convenções em que o próprio nome da classe é significativo como uma variável de membro.
Por exemplo, considere o seguinte exemplo:
Neste exemplo, ter uma variável de membro chamada Employee torna o código mais intuitivo e autoexplicativo.
Ao relaxar a regra em C++03 para permitir tal uso quando não há construtor declarado pelo usuário, o padrão acomodou esses cenários sem sacrificar a clareza do código ou introduzir confusão significativa. Essa mudança deu aos desenvolvedores mais liberdade para estruturar seu código de uma forma que se alinhe aos seus modelos conceituais sem violar as regras da linguagem.