No escopo do arquivo, não há diferença em C ++. consttorna 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 constvalor de instância pode ser calculado na lista de inicializadores do ctor . A static consté definido durante a inicialização e permanece inalterado pelo restante do programa. (Nota: o código para staticmembros parece um pouco diferente porque a declaração e a inicialização são separadas.)
Lembre-se, em C ++, constsignifica somente leitura , não constante . Se você tem um ponteiro para const, outras partes do programa podem alterar o valor enquanto você não está procurando. Se a variável foi definida com const, ninguém poderá alterá-la após a inicialização, mas a inicialização ainda pode ser arbitrariamente complexa.
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.