Não consigo encontrar muitas informações sobre const_cast
. A única informação que consegui encontrar (no Stack Overflow) é:
O
const_cast<>()
é usado para adicionar / remover const (ness) (ou volatile-ness) de uma variável.
Isso me deixa nervoso. Poderia usar um const_cast
comportamento inesperado de causa? Se sim, o quê?
Como alternativa, quando posso usar const_cast
?
c++
casting
const-cast
Mag Roader
fonte
fonte
const
objeto original por meio de umaconst
referência / ponteiro cancelado. Se, em vez disso, você estiver apenasconst_cast
tentando contornar uma API mal especificada (ou, no meu caso, preguiçosamente), que apenas aceita uma nãoconst
referência, mas será usada apenas emconst
métodos ... sem problemas.Respostas:
const_cast
é seguro apenas se você estiver lançando uma variável que originalmente não eraconst
. Por exemplo, se você tem uma função que recebe um parâmetro de aconst char *
e passa um modificávelchar *
, é seguroconst_cast
voltar a esse parâmetro para achar *
e modificá-lo. No entanto, se a variável original era de fatoconst
, o usoconst_cast
resultará em um comportamento indefinido.fonte
§7.1.5.1/4 says Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior
Qualquer tentativa ! Não há palavras sobre a variável original.const_cast
para removerconst
a partir de algo que foi inicialmente declaradoconst
. Mas é UB tentar realmente escrever nesse objeto. Contanto que você acabou de ler, você está bem e issoconst_cast
por si só não causa UB. É uma ideia horrível, mas não é inerentemente UB.Posso pensar em duas situações em que const_cast é seguro e útil (pode haver outros casos válidos).
Uma é quando você tem uma instância const, referência ou ponteiro e deseja passar um ponteiro ou referência a uma API que não é const-correta, mas que você CERTAIN não modificará o objeto. Você pode const_cast o ponteiro e passá-lo para a API, confiando que isso não mudará nada. Por exemplo:
A outra é se você estiver usando um compilador mais antigo que não implementa 'mutável' e quiser criar uma classe que seja logicamente const, mas não bit a bit const. Você pode const_cast 'this' dentro de um método const e modificar membros de sua classe.
fonte
const_cast
pode causar comportamento indefinido, não quais são suas aplicações úteisconst_cast
é uma resposta válida. Não háhe
perguntas, pois só a questão é o assunto.Acho difícil acreditar que essa é a única informação que você pode encontrar sobre const_cast. Citando o segundo hit do Google :
fonte
const_cast
. Ou chame um método const nele.O que Adam diz. Outro exemplo onde const_cast pode ser útil:
Primeiro adicionamos const aos
this
pontos de tipo , então chamamos a versão const degetT
, e então removemos const do tipo de retorno, que é válido, poist
deve ser não-const (caso contrário, a versão não-const degetT
não poderia ter foi chamado). Isso pode ser muito útil se você tiver um corpo de função grande e quiser evitar código redundante.fonte
const_cast
oustatic_cast
é melhor.const_cast
só pode fazer o que você quiser: alterar os qualificadores cv.static_cast
pode 'silenciosamente' realizar outras operações que você não pretende. No entanto, o primeiro gesso é totalmente seguro estatic_cast
tende a ser mais seguro do queconst_cast
. Acho que essa é uma situação em que oconst_cast
comunica melhor sua intenção, masstatic_cast
comunica melhor a segurança de suas ações.A resposta curta é não, não é seguro.
A resposta longa é que, se você souber o suficiente para usá-lo, ele deve ser seguro.
Quando você está lançando, o que essencialmente está dizendo é: "Eu sei algo que o compilador não sabe." No caso de const_cast, o que você está dizendo é: "Mesmo que este método aceite uma referência ou ponteiro não const, eu sei que ele não mudará o parâmetro que eu passar."
Portanto, se você realmente sabe o que afirma saber ao usar o gesso, não há problema em usá-lo.
fonte
Você está destruindo qualquer chance de thread-safety, se começar a modificar coisas que o compilador pensava que eram constantes.
fonte
const
.const
é confiança.const_cast
está quebrando essa confiança :(fonte: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm
fonte