Em C ++, é possível usar a static
palavra - chave em uma unidade de tradução para afetar a visibilidade de um símbolo (variável ou declaração de função).
No n3092, isso foi descontinuado:
Anexo D.2 [depr.static]
O uso da palavra-chave static é descontinuado ao declarar objetos no escopo do namespace (ver 3.3.6).
No n3225, isso foi removido.
O único artigo que consegui encontrar é um tanto informal.
No entanto, ele destaca que, para compatibilidade com C (e a capacidade de compilar programas C como C ++), a depreciação é irritante. No entanto, compilar um programa C diretamente como C ++ já pode ser uma experiência frustrante, portanto, não tenho certeza se merece consideração.
Alguém sabe por que foi alterado?
Respostas:
Em C ++ Standard Core Language Defect Reports and Accepted Issues, Revisão 94 sob 1012. Undeprecating static `eles observam:
Basicamente, dizendo que a depreciação de
static
não faz sentido. Ele nunca será removido do C ++ e ainda é útil porque você não precisa do código clichê de que precisa com namespaces não nomeados, se quiser apenas declarar uma função ou objeto com ligação interna.fonte
static class ...
, OTOH, não funcionará.namespace {
" e "}
"?Tentarei responder à sua pergunta, embora seja uma pergunta antiga e não pareça muito importante (na verdade não é muito importante por si só ), e já recebeu respostas muito boas. O motivo pelo qual desejo responder é que ele se relaciona a questões fundamentais de evolução padrão e design de linguagem quando a linguagem é baseada em uma linguagem existente: quando os recursos da linguagem devem ser descontinuados, removidos ou alterados de maneiras incompatíveis?
A ligação, na verdade.
A suspensão de uso indica:
O último ponto é importante. Embora nunca haja uma promessa formal de que seu programa não será quebrado, às vezes silenciosamente, pelo próximo padrão, o comitê deve tentar evitar quebrar o código "razoável". A depreciação deve dizer aos programadores que não é razoável depender de algum recurso .
É muito importante preservar um subconjunto comum C / C ++, especialmente para arquivos de cabeçalho. Obviamente,
static
as declarações globais são declarações de símbolo com ligação interna e isso não é muito útil em um arquivo de cabeçalho.Mas o problema nunca é apenas compatibilidade com C, é compatibilidade com C ++ existente: há toneladas de programas C ++ válidos existentes que usam
static
declarações globais. Este código não é apenas formalmente legal, é sólido, pois usa um recurso de linguagem bem definido da forma como deve ser usado .Só porque agora existe uma "maneira melhor" (de acordo com alguns) de fazer algo não torna os programas escritos à maneira antiga "ruins" ou "irracionais". A capacidade de usar a
static
palavra-chave em declarações de objetos e funções em escopo global é bem compreendida nas comunidades C e C ++ e, na maioria das vezes, usada corretamente.Na mesma linha, não vou mudar as projeções do estilo C
double
parastatic_cast<double>
apenas porque "as projeções do estilo C são ruins", poisstatic_cast<double>
adiciona zero informação e zero segurança.A ideia de que sempre que uma nova maneira de fazer algo é inventada, todos os programadores se apressariam em reescrever seu código de trabalho bem definido existente é simplesmente louca. Se você deseja remover toda a feiura e problemas herdados do C, não altere o C ++, mas sim invente uma nova linguagem de programação. Remover pela metade um uso de
static
dificilmente torna o C ++ menos feio para C ++.As mudanças de código precisam de uma justificativa, e "velho é ruim" nunca é uma justificativa para mudanças de código.
Interromper as mudanças de linguagem precisa de uma justificativa muito forte. Tornar a linguagem um pouco mais simples nunca é uma justificativa para uma alteração significativa.
As razões dadas por que
static
é ruim são notavelmente fracas, e nem mesmo está claro por que os objetos e as declarações de função não são reprovados juntos - dar a eles um tratamento diferente dificilmente torna o C ++ mais simples ou mais ortogonal.Então, realmente, é uma história triste. Não por causa das consequências práticas que teve: teve exatamente zero consequências práticas. Mas porque mostra uma clara falta de bom senso do comitê ISO.
fonte
static
ou namespaces anônimos, também não estou encorajando ou desencorajando. Meu ponto é que, se você realmente deseja desencorajar as pessoas a usarem namespaces anônimos, você deve apresentar um bom argumento. Na prática, acredito que na maioria das implementações as entidades declaradas em um namespace não nomeado são símbolos exportados com um nome aleatório, aumentando assim a tabela de exportação. As entidades declaradas comostatic
, OTOH, não são exportadas de forma alguma. Assim, muitas pessoas escolhem, com base nessa observação, usarstatic
.static
nunca desaparecerá, então é errado descontinuá-lo. “ Ainda assim, você não argumenta que desencorajar seu uso seja errado. ” Não vi nenhum argumento convincente que mostre que o uso de namespace-scopestatic
seja “errado”. Desaprová-lo apenas para desencorajar seu uso é errado, porque ninguém realmente acredita que ele vai desaparecer e porque ele não convence as pessoas de que usá-lo é "errado".Obsoleto ou não, a remoção desse recurso de idioma quebraria os códigos existentes e incomodaria as pessoas.
Toda essa coisa de depreciação estática era apenas ilusão ao longo das linhas de "namespaces anônimos são melhores do que estáticos" e "referências são melhores indicadores". Ri muito.
fonte
char* foo = new char; char& ref = *foo;
Só porque você recebeu um ponteiro, inicialmente não diz nada sobre sua capacidade de usar referências.