В этом моем вопросе @DeadMG говорит, что повторная инициализация класса с помощью указателя this
является неопределенным поведением. Есть ли где-нибудь упоминание о нем в стандарте?
Пример:
#include <iostream>
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 говорит, что прямой вызов деструктора допустим, если он вызывается один раз для каждого конструктора.
this
. Если это так, вы все равно можете обойти это, взяв копиюthis
перед вызовом деструктора. - person Luc Danton   schedule 03.06.2011u.m.~M(); new (&u.n) N;
сейчас, в примерах это не делается из внутри метода, но я не знаю, имеет ли это значение. - person David Rodríguez - dribeas   schedule 03.06.2011this
в качестве ключевого слова, а не его конкретного значения. То есть, я думал о том, смогу ли я до получить доступ к значению (что, очевидно, правильно из-за других требований), будет ли вообще разрешено использованиеthis
? - person Luc Danton   schedule 30.09.2011this
- это просто ключевое слово, используемое для получения значения неявного параметра нестатических функций-членов. Даже в программах, гдеthis->~T();
,delete this;
илиnew (this) T;
никогда не используются,this
может относиться к объекту, который еще не полностью построен, в некоторых случаях, например, когда построение подобъекта даже не началось. - person curiousguy   schedule 30.09.2011this
, потому что в противном случае код правильный. Я не говорил, что «использоватьthis
неправильно». - person Luc Danton   schedule 30.09.2011