Внутреннее устройство C++: игра с указателем this

У меня есть несколько вопросов о внутренней работе C++. Например, я знаю, что каждая функция-член класса имеет неявный скрытый параметр, который является указателем this (во многом так же, как это делает Python):

class Foo 
{
    Foo(const Foo& other);
};

// ... is actually...

class Foo
{
    Foo(Foo* this, const Foo& other);
};

Разве я не прав, предполагая, что правильность функции не зависит напрямую от правильности этого (поскольку это просто еще один параметр)? Я имею в виду, конечно, если вы попытаетесь получить доступ к члену this-указателя, лучше, чтобы он был действительным, но в противном случае функция будет продолжаться, если this будет удален, верно?

Например, что, если я напортачу с указателем this и сделаю что-то вроде того, что вы видите ниже? Является ли это неопределенным поведением или оно определяется крайне обескураженным? (спрашиваю из чистого любопытства).

Foo:Foo(const Foo& other)
{
    delete this;
    this = &other;
}

person Paul Manta    schedule 19.04.2011    source источник


Ответы (2)


Вы не можете назначить this - это тип Foo * const. Вы можете delete this; при определенных обстоятельствах, но это редко бывает хорошей идеей.

person Erik    schedule 19.04.2011
comment
Что, если я отброшу константность? - person Paul Manta; 19.04.2011
comment
Я уверен, что это конкретно не определено в стандарте, но разве его определение не подразумевается? Определено отбрасывание константности, с чисто технической точки зрения this — это просто еще один параметр, удаление и назначение указателей, очевидно, определено... Что там не определено? - person Paul Manta; 19.04.2011
comment
@Paul: см. 7.1.5.1/4. Короче говоря, попытки изменить что-то, что действительно является константой, приводит к UB. - person Erik; 19.04.2011
comment
@Paul: Кроме того, см. 3.10 по lvalue/rvalue. this не является lvalue. - person Erik; 19.04.2011
comment
Несколько недоразумений: тип this равен Foo*; нет конст. Но это не переменная; это ключевое слово, представляющее rvalue (поэтому и нет const), например 42. Вы не можете назначать this или изменять его больше, чем вы можете назначать или изменять 42. И delete this — частая идиома; в некоторых приложениях это почти единственное использование delete. - person James Kanze; 19.04.2011

this определяется как,

Foo(Foo* const this, ...);

Отказ от constness не невозможен для this (особый случай). Компилятор будет выдавать ошибки для того же самого. Я задал аналогичный вопрос .

person iammilind    schedule 19.04.2011