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
.