Является ли `new (this) MyClass ();` неопределенное поведение после прямого вызова деструктора?

В этот мой вопрос @DeadMG говорит, что повторная инициализация класса с помощью указателя this является неопределенным поведением. Есть ли где-нибудь упоминание об этом в стандарте?

Пример:

#include 

class X{
  int _i;
public:  
  X() : _i(0) { std::cout << "X()\n"; }
  X(int i) : _i(i) { std::cout << "X(int)\n"; }

  ~X(){ std::cout << "~X()\n"; }

  void foo(){
    this->~X();
    new (this) X(5);
  }

  void print_i(){
    std::cout << _i << "\n";
  }
};

int main(){
  X x;
  x.foo();
  // mock random stack noise
  int noise[20];
  x.print_i();
}

Пример вывода на Ideone (я знаю, что UB также может быть «на вид правильным поведением»).
Обратите внимание, что я не вызывал деструктор вне класса, чтобы не получить доступ к объекту, время жизни которого закончилось. Также обратите внимание, что @DeadMG говорит, что прямой вызов деструктора допустим, если он вызывается один раз для каждого конструктора.

9
задан Community 23 May 2017 в 11:45
поделиться