История изменений
Исправление KennyMinigun, (текущая версия) :
Немного запутался. Может быть в данном случае: «b может быть 5 вместо ожидаемого 4.» ?
Да, прошу прощения, опечатка. Надо было «b может быть 3 вместо ожидаемого 5.»
struct X {
const int n; // note: X has a const member
int m;
};
X *p = new X{3, 4};
const int a = p->n;
X* np = new (p) X{5, 6};
const int b = p->n; // undefined behavior
Сначала X(*p).n
инициализуется в 3, потом placement new заменяет его реальное значение на 5. Однако компилятор зная, что чтение после placement new — UB делает (например) constant propagation и пишет
const int a = 3;
const int b = 3;
А может потом и вовсе обьединить две константы в одну. Но опять же — лишь спекуляция на тему возможной реализации в случае UB.
Исходная версия KennyMinigun, :
Немного запутался. Может быть в данном случае: «b может быть 5 вместо ожидаемого 4.» ?
Да, прошу прощения, опечатка. Надо было «b может быть 5 вместо ожидаемого 3.»
struct X {
const int n; // note: X has a const member
int m;
};
X *p = new X{3, 4};
const int a = p->n;
X* np = new (p) X{5, 6};
const int b = p->n; // undefined behavior
Сначала X(*p).n
инициализуется в 3, потом placement new заменяет его реальное значение на 5. Однако компилятор зная, что чтение после placement new — UB делает (например) constant propagation и пишет
const int a = 3;
const int b = 3;
А может потом и вовсе обьединить две константы в одну. Но опять же — лишь спекуляция на тему возможной реализации в случае UB.