Há UB no código abaixo?
#include <iostream>
int* p_n;
class A
{
public:
A(int val) : n(val)
{
// At this point the compiler does not know if the object is const or not.
p_n = &n;
}
int n;
};
int main()
{
// A::n is const, because A is const, right?
const A a(1);
// but we change a const value here
*p_n = 2;
std::cout << a.n << std::endl;
return 0;
}
Existe alguma diferença entre atribuir *p_n
e fazer isso?
const_cast<A&>(a).n = 2;
EDITAR
Daqui :
const e semântica volátil (7.1.6.1) não são aplicadas em um objeto em construção. Elas entram em vigor quando o construtor para o objeto mais derivado (1.8) termina.
Enquanto o objeto a
está em construção, ele não é const
e a.n
não é const
, mas eles se tornam const
quando o construtor termina.
Então, p_n
aponta para o const
objeto ou não?
Sim. O código tenta modificar um
int
which isconst
. Ele faz isso contornando const-correctness, da maneira que você já descobriu.Sim,
a
éconst
, portantoa.n
não pode ser modificado.Uma vez que você conseguiu ignorar
const
e modificara.n
, que não pode ser modificado, todas as apostas estão canceladas. O código tem comportamento indefinido.Não. Isso
const_cast
não muda o fato de quea
éconst
.Considere que você pode ter um ponteiro para const, ou uma referência const para um objeto que não é realmente const, por exemplo:
Aqui você poderia lançar fora constness da referência para modificar o inteiro. O inteiro não é
const
. Tomar uma referência const não muda que o objeto em si não éconst
. Semelhante ao seu exemplo, nenhuma hackeagem de ponteiro nem casts mudará a constness dea
.Sobre sua edição... Ela não muda o fato de que
a
isconst
e quea.n
uma vez construído isconst
. A citação que você adicionou apenas explica o buraco na correção constante que seu código usa para invocar comportamento indefinido.O motivo
const
é aplicado somente após a construção, pois, caso contrário, um construtor que constrói umconst
objeto seria bem inútil. O construtor é necessário para estabelecer as invariantes de classe, o que normalmente requer a modificação do objeto.