LINUX.ORG.RU

История изменений

Исправление 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.