struct Foo
{
void f()
{
// (*)
}
};
Quel est le type de "ceci" dans la ligne marquée d'un (*)?
Est-ce que c'est const Foo * ou Foo * ?
struct Foo
{
void f()
{
// (*)
}
};
Quel est le type de "ceci" dans la ligne marquée d'un (*)?
Est-ce que c'est const Foo * ou Foo * ?
n3376 9.3.2/1
Dans le corps d'un non-statique (9.3) de la fonction membre, le mot clé c'est un prvalue expression dont la valeur c'est l'adresse de l'objet pour lequel la fonction est appelée.
Le type de cette dans une fonction de membre de une classe de X est X*. Si la fonction de membre est déclarée const, le type de ce qui est const X*, si le membre la fonction est déclarée volatile, le type de ce qui est volatile X*, et si la fonction de membre est déclaré const volatile, le type de ce qui est const volatile X*.
À l'intérieur d' f
, this
type Foo *
car f
n'est pas un const
de la fonction membre.
Vous ne pouvez pas appeler f
sur const Foo
objet. Le suivant est erroné:
const Foo obj;
obj.f();
C'est précisément parce qu'à l'intérieur Foo::f
, l' this
pointeur est - Foo *
plutôt que d' const Foo *
, et donc l'appel de la fonction exige un pointeur de conversion qui se défausse d'une qualification.
L' this
pointeur lui-même n'est pas une variable. Il n'est pas cessible, mais pas à cause d'un const
de qualification. Il n'y a pas de déclaration dans le champ d'application tels que l' Foo *const this
. Un this
expression n'est tout simplement pas une lvalue, comme une règle de la langue.
L' this
pointeur n'est pas très différent de &obj
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.