No C ++ especificamente, quais são as diferenças semânticas entre, por exemplo:
static const int x = 0 ;
e
const int x = 0 ;
para ambos, static
como um enlace e um especificador de classe de armazenamento (ou seja, dentro e fora de uma função).
static
é provavelmente a palavra-chave mais sobrecarregada em C ++. O significado do seu código varia amplamente, dependendo se está no escopo do espaço para nome, no escopo da classe ou no escopo da função. Você pode esclarecer isso.::
sem identificador na frente). Não estou ciente de diferenças significativas entre o espaço para nome global e qualquer espaço para nome aninhado nele. Certamente não hástatic
objetos a respeito .Respostas:
No escopo do arquivo, não há diferença em C ++.
const
torna o vínculo interno o padrão e todas as variáveis globais têm vida útil estática. Mas a primeira variante tem o mesmo comportamento em C, portanto, esse pode ser um bom motivo para usá-lo.Dentro de uma função, a segunda versão pode ser calculada a partir de parâmetros. Em C ou C ++, não precisa ser uma constante em tempo de compilação, como algumas outras linguagens exigem.
Dentro de uma classe, basicamente a mesma coisa que para funções. Um
const
valor de instância pode ser calculado na lista de inicializadores do ctor . Astatic const
é definido durante a inicialização e permanece inalterado pelo restante do programa. (Nota: o código parastatic
membros parece um pouco diferente porque a declaração e a inicialização são separadas.)Lembre-se, em C ++,
const
significa somente leitura , não constante . Se você tem um ponteiro paraconst
, outras partes do programa podem alterar o valor enquanto você não está procurando. Se a variável foi definida comconst
, ninguém poderá alterá-la após a inicialização, mas a inicialização ainda pode ser arbitrariamente complexa.fonte
const
aplica-se a uma visão da variável e não à própria variável, alguém pode ter uma nãoconst
visão da mesma variável, e o compilador ficará bastante silencioso quando a modificar.const
, mas o novoconstexpr
pode ser usado em vez (e em outros cenários também). Na verdade, o padrão C ++ 0x expande a capacidade de usarconst
nesse cenário para "tipos literais" não integrais. Eu acho que prefiro usarconstexpr
nesses casos, já que você estaria quebrando a compatibilidade com os compiladores pré-C ++ 0x.O rascunho padrão do C ++ 17
const
implicastatic
no escopo do arquivoEsta é a cotação do que foi mencionado em: https://stackoverflow.com/a/3709257/895245
C ++ 17 n4659 rascunho padrão 6.5 "Programa e ligação":
Anexo C (informativo) Compatibilidade, C.1.2 Cláusula 6: "conceitos básicos" fornece a justificativa por que isso foi alterado de C:
Veja também: Por que const implica ligação interna em C ++, quando não em C?
O que você provavelmente quer fazer nos cabeçalhos
Explicado em detalhes em: O que significa 'const static' em C e C ++?
extern
no cabeçalho, definição no arquivo cppfonte