No C ++, para declarar um objeto de uma classe que possui uma variável de membro como const
, precisamos ter um construtor padrão definido pelo usuário. O código a seguir ilustra isso.
class Some {
int value;
};
int main() {
// error: default initialization of an object of const type 'const Some'
// without a user-provided default constructor
const Some some;
return 0;
}
No entanto, se uma variável de membro pertencente a uma classe for qualificada como mutável, o compilador não relatará nenhum erro. Para referência, eu compilado usando o comando clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug
. Gostaria de saber se este resultado é devido a um erro no compilador ou de acordo com a sintaxe definida na linguagem C ++.
class Some {
mutable int value;
};
int main() {
const Some some;
return 0;
}
mutable
é o oposto deconst
. Por que você esperava o mesmo efeito?const
, o que significa que ele não pode ser alterado e, com valores não inicializados, não há utilidade para esse tipo de código e é por isso que é proibido. Quando você usa amutable
palavra-chave - significa que o valor pode ser alterado posteriormente, para que o código possa ser usado de maneira previsível.Respostas:
Reescrevendo meu comentário como resposta, espero que ajude alguém.
Não faz sentido declarar um objeto const se não for inicializado de alguma forma.
Considere o seguinte código:
clang diz:
error: default initialization of an object of const type 'const int'
.o gcc diria:
error: uninitialized const ‘x’ [-fpermissive]
A lógica por trás disso é que não há sentido nesse tipo de declaração.
O valor de
x
nunca pode mudar e, portanto, esse código seria imprevisível, poisx
seria mapeado para a memória não inicializada.No seu exemplo, adicionar a palavra
mutable
- chave avalue
significa que, embora aSome
instância seja constante quando declarada como:Ainda é possível mudar
value
posteriormente.Por exemplo:
Isso significa que é possível usar esse código de maneira previsível, pois
value
pode ser definido posteriormente e não há constantes não inicializadas.fonte