Substituindo um objeto por um objeto do mesmo tipo
O seguinte está bem definido?
#include <iostream>
#include <string.h>
using namespace std;
struct Const {
const int i;
Const (int i) : i(i) {}
int get0() { return 0; } // best accessor ever!
};
int main() {
Const *q,*p = new Const(1);
new (p) Const(2);
memcpy (&q, &p, sizeof p);
cout << q->i;
return 0;
}
Observe que após a construção do segundoConst
, p
não semanticamente (intencionalmente?) aponta para um novo objeto e o primeiro se foi, portanto é utilizável "comovoid*
". Mas o segundo objeto é construído exatamente no mesmo endereço, então o padrão de bits dep
representa o endereço do novo objeto.
COMENTE
new (p) Const(2)
apague o objeto antigo armazenado emp
, portanto, o ponteiro não é mais válido, exceto como um ponteiro para armazenamento (void*
)
Eu quero recuperar o valor dep
como umConst*
.
COMENTÁRIO 2
Depois dep->~Const()
oumemset (p, 0, sizeof *p)
é claro quep
não aponta para um objeto válido, entãop
só pode ser usado como ponteiro para armazenamento (void*
ouchar*
), por exemplo, para reconstruir outro objeto. Nesse pontop->get0()
não é permitido.
Aqui a demolição do objeto antigo é feita pelo construtor do novo, mas não acho que isso faça diferença.
Minha intuição é que:De qualquer forma, o objeto antigo se foi ep
aponta para o objeto antigo, não para o novo.
Estou à procura de umconfirmação ou refutação com base no padrão.
VEJA TAMBÉM
Fiz essencialmente a mesma pergunta sobre ponteiros, em C e C ++:
Desreferenciando um ponteiro fora do limite que contém o endereço de um objeto (matriz da matriz)Memcpy de um ponteiro é o mesmo que atribuição?As variáveis de ponteiro são apenas números inteiros com alguns operadores ou são "místicas"?Por favor, leia estas discussões antes de responder "isso é ridículo".