C ++: por qué la función miembro estática no se puede crear con el calificador 'const'

86

Hoy tengo un problema. Necesito una staticfunción de miembro, constno es imprescindible, sino mejor. Pero no tuve éxito en mis esfuerzos. ¿Alguien puede decir por qué o cómo?

prabhakaran
fuente
1
¿Qué constsignificaría para usted una función miembro estática?
GManNickG
2
@GMan Me refiero a que una función miembro estática que nunca cambia ninguna de sus entradas.
prabhakaran
11
Entonces sus entradas (parámetros de función) deben ser por valor o por referencias constantes.
GManNickG
3
De todos modos, no afecta la consistencia de los argumentos de las funciones miembro. No significa "hacer que todo sea constante", significa "hacer que esta constante".
UncleBens
@GMan, ¿estás diciendo que se debe agregar const a los argumentos
Prabhakaran

Respuestas:

137

Cuando aplica el constcalificador a una función miembro no estática, afecta al thispuntero. Para una función miembro de clase calificada const C, el thispuntero es de tipo C const*, mientras que para una función miembro que no está calificada const, el thispuntero es de tipo C*.

Una función miembro estática no tiene thispuntero (dicha función no se llama en una instancia particular de una clase), por lo que la calificación constante de una función miembro estática no tiene ningún sentido.

James McNellis
fuente
¿Significa que 'const' es solo para variables como int, pointer, etc.?
prabhakaran
@prabhakaran: las funciones de los miembros también se pueden calificar const . James lo mencionó claramente en su respuesta.
Mahesh
El calificador const de la función @Mahesh Member también califica solo el 'este puntero', no el todo. Aún puede cambiar la variable global dentro de la función miembro calificado const. Ahora solo yo marqué esto.
prabhakaran
5
-1 "Una función miembro estática no tiene un puntero this ... así que la calificación constante de una función miembro estática no tiene ningún sentido [de esa manera]" es verdadera en sí misma pero es incorrecta como respuesta a la pregunta "por qué ". Como respuesta, se supone que el significado de consttendría que ser el mismo para un miembro estático que para uno no estático. Como ejemplo de que ese pensamiento no se sostiene, considere el significado de static, que depende del contexto.
Saludos y hth. - Alf
2
¿Es C const*o const C*?
crisron
24

Estoy de acuerdo con tu pregunta, pero desafortunadamente C ++ está diseñado de esa manera. Por ejemplo:

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

A día de hoy, constse considera en el contexto de this. En cierto modo, es estrecho. Se puede ampliar aplicando esto constmás allá del thispuntero.
es decir, el "propuesto" const, que también puede aplicarse a staticfunciones, restringirá a los staticmiembros de cualquier modificación.

En el código de ejemplo, si foo()se puede hacer const, entonces en esa función, A::sno se puede modificar. No puedo ver ningún efecto secundario del idioma, si esta regla se agrega al estándar. Por el contrario, ¡es divertido que no exista tal regla!

iammilind
fuente
8
Probablemente sea la misma que la razón por la que no puede modificar constantemente una función libre para que signifique "esta función no modifica ninguna variable global". constse aplica a un objeto (en el caso de las funciones miembro const, la instancia en la que se llama). Si desea que se aplique a todos los miembros estáticos de la clase, supongo que si el comité lo consideró en absoluto, no se pensó que fuera un requisito lo suficientemente común como para ser compatible.
Steve Jessop
1
El constmodificador no se aplica a métodos de miembro o variables de miembro, sino al thispuntero implícito . Dado que un método de miembro estático no está vinculado a un objeto, no hay ningún thispuntero para hacer const.
Ruud Althuizen
1

Sin entrar en detalles, es porque puede haber o no un objeto modificado por la función, por lo que const es ambiguo para el compilador.

Recuerde que constmantiene los objetos constantes, pero puede que haya o no un objeto aquí para mantener constante.

Don laringe
fuente
2
"puede o puede que no"? Una función miembro estática nunca tiene un thispuntero. (Además de lo cual, constno mantiene los objetos constantes. Evita que un puntero o referencia en particular se use para modificar el objeto, pero la modificación aún podría ocurrir a través de otra ruta)
Ben Voigt
1

Es lamentable que C ++ no lo acepte según el diseño, pero lógicamente hay pocos casos de uso en los que se valida bien.

Una función que es válida a nivel de clase (estática) podría no cambiar ningún dato estático, puede ser que solo los datos de consulta sean constantes. Tal vez debería ser como

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

Una 'función miembro const' no puede modificar el objeto al que se llama, pero las funciones miembro estáticas no se llaman en ningún objeto. Es utilizado directamente por el operador de resolución de alcance. Por lo tanto, tener una función miembro estática constante no tiene sentido, por lo que es ilegal.

nihal dixit
fuente