struct Foo
{
void f()
{
// (*)
}
};
Каков тип "this" в строке, помеченной (*)?
Это const Foo * или Foo *?
struct Foo
{
void f()
{
// (*)
}
};
Каков тип "this" в строке, помеченной (*)?
Это const Foo * или Foo *?
n3376 9.3.2/1
В теле нестатической (9.3) функции-члена ключевое слово this представляет собой выражение prvalue, значение которого это адрес объекта, для которого вызывается функция.
Тип этого в членной функции класс X является X *. Если функция-член объявлена const, тип этого является const X *, если член функция объявлена volatile, тип которой является изменчивым X *, и если объявлена функция-член const volatile, тип этого - константа volatile X *.
Внутри f, this имеет тип Foo *, потому что f не является функцией члена const.
Вы не можете вызвать f для объекта const Foo. Следующие ошибки ошибочны:
const Foo obj;
obj.f();
Именно поэтому внутри Foo::f указатель this имеет значение Foo *, а не const Foo *, поэтому вызов функции требует преобразования указателя, который отбрасывает квалификатор.
Указатель this сам по себе не является переменной. Он не присваивается, но не из-за квалификатора const. В области видимости нет описания, например Foo *const this. A this выражение просто не является значением lvalue, как правило, для языка.
Указатель this не очень отличается от &obj.
Тип этого зависит от функции-члена.
Например, для класса X, если функции-члены
1) const, Тогда это имеет тип const X *
2) volatile, тогда это volatile X * и т.д.
в противном случае X *
this относится к текущему объекту. Тип this в С++ - Foo *const.