Por que o C ++ fez alguma distinção entre globais estáticos (ligação interna) e símbolos em um espaço para nome sem nome (ligação externa, mas não há como se referir a ela de fora de qualquer maneira), ao introduzir a última?
Algum desses motivos ainda é válido ou existem novos?
Ainda existem lugares onde ainda são diferentes, mas a regra arbitrária de que as uniões globais anônimas (ou com espaço de nome) devem ser
static
e quais são?Para pontos de bônus, se não houver boas razões para serem diferentes, existe um pedido para torná-los equivalentes?
Quando o C ++ introduziu namespaces (C ++ 98) e, especificamente, os namespaces sem nome, os globos estáticos foram preteridos como obsoletos e inferiores à novidade em um momento de entusiasmo, embora isso tenha sido revertido com o C ++ 11 :
Deprecação da palavra-chave estática… não mais?
Antes do C ++ 11, os símbolos com ligação interna não podiam ser usados como argumentos do modelo: Por que o C ++ 03 exigia que os parâmetros do modelo tivessem ligação externa?
Respostas:
Suponho que isso não responda a todas as suas perguntas (ou alguma?), Mas a principal diferença entre declarações estáticas no nível de arquivo e espaços para nome anônimos é que os espaços para nome também se aplicam aos tipos (você não pode declarar um
static
tipo no No mesmo sentido em que você declara uma variável), é por isso que o namespace é preferido, para que haja um idioma único para declarar dados e tipos no escopo do arquivo.Exemplificando, o código a seguir deve compilar perfeitamente. (Não é realmente útil, pois você não pode distinguir entre os dois tipos, mas é permitido)
Um teste ao vivo aqui .
fonte
struct Foobar
? Pior ainda, suponha que seja agoraclass Foobar
. Pense em como você planeja criar construtores para os dois.