Bunu yapabilirsiniz, ancak referans veya const üyeleriniz varsa veya sınıfın türü değişirse bunun için bellek yıkamaya ihtiyacınız olacaktır.
Bunu düşün:
struct FooView {
const int val;
void refresh()
{
this->~FooView();
new (this) FooView{5};
}
}
int main() {
FooView fv{9};
std::cout << fv.val; // surely 9!
fv.refresh();
std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}
Bu tanımsız davranışı önlemek için, belleği kullanarak aklamak gerekir std::launder
. Derleyici, kullanım ömrünün fv
dışındaki herhangi bir şeyden etkilenmeyeceğini varsayacaktır }
. Aklama derleyicinin aşağıdakilerle ilgisi olmayan bir nesne olduğunu varsaymasını sağlayacaktır fv
:
int main() {
FooView fv{9};
std::cout << fv.val; // surely 9!
fv.refresh();
std::cout << std::launder(&fv)->val; // yay, 5
}
Şimdi iyi bir fikir mi? Karışıklıklara yol açabileceğinden, ancak güvenli bir şekilde yapılabileceğinden buna karşı tavsiye ederim.