web-dev-qa-db-fra.com

C ++ - Pourquoi la fonction membre statique ne peut pas être créée avec le qualificatif «const»

Aujourd'hui, j'ai un problème. J'ai besoin d'une fonction membre static, const n'est pas un must mais un meilleur. Mais, je n'ai pas réussi dans mes efforts. Quelqu'un peut-il dire pourquoi ou comment?

76
prabhakaran

Lorsque vous appliquez le qualificatif const à une fonction membre non statique, il affecte le pointeur this. Pour une fonction membre qualifiée const de classe C, le pointeur this est de type C const*, alors que pour une fonction membre qui n'est pas qualifiée const, le pointeur this est de type C*.

Une fonction membre statique n'a pas de pointeur this (une telle fonction n'est pas appelée sur une instance particulière d'une classe), donc la qualification const d'une fonction membre statique n'a aucun sens.

122
James McNellis

Je suis d'accord avec votre question, mais malheureusement le C++ est conçu de cette façon. Par exemple:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

À ce jour, le const est considéré dans le contexte de this. D'une certaine manière, c'est étroit. Il peut être élargi en appliquant ce pointeur const au-delà de this.
c'est à dire. le const "proposé", qui peut également s'appliquer aux fonctions static, limitera les membres static de toute modification.

Dans l'exemple de code, si foo() peut être créé const, alors dans cette fonction, A::s Ne peut pas être modifié. Je ne vois aucun effet secondaire sur la langue si cette règle est ajoutée à la norme. Au contraire, il est amusant que cette règle n'existe pas!

21
iammilind

Il est regrettable que C++ ne l'accepte pas selon la conception mais logiquement il y a peu de cas d'utilisation dans lesquels il valide bien.

Une fonction qui est valide au niveau de la classe (statique) peut ne pas changer de données statiques, peut-être qu'elle interrogera simplement les données qui devraient être const. Peut-être que ça devrait être comme

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
0
Raghavendar Reddy

Sans entrer dans les détails, c'est parce qu'il peut y avoir ou non un objet modifié par la fonction, donc const est ambigu pour le compilateur.

Rappelez-vous que const maintient les objets constants, mais il peut y avoir ou non un objet ici pour rester constant.

0
Don Larynx