C++:referencia const, antes vs después del especificador de tipo

C++:referencia const, antes vs después del especificador de tipo

Comportamiento

No hay diferencia semántica entre const T& y T const&; el lenguaje los trata como del mismo tipo. (Lo mismo se aplica a const T* y T const* .)

Por una cuestión de estilo

Sin embargo, con respecto a cuál debería preferir estilísticamente, disentiré de muchas de las otras respuestas y preferiré const T& (y const T* ):

  • const T& es el estilo utilizado en El lenguaje de programación C++ de Stroustrup libro.
  • const T& es el estilo utilizado en el propio estándar C++.
  • const T* es el estilo utilizado en el lenguaje de programación C de K&R libro.
  • const T* es el estilo utilizado en el estándar C.
  • Debido a los factores anteriores, creo que const T& /const T* tienen mucha más inercia que T const& /T const* . const T& /const T* empíricamente me parece mucho más común que T const& /T const* en todo el código C++ y C que he visto. Creo que seguir las prácticas comunes es más legible que adherirse dogmáticamente a las reglas de análisis de derecha a izquierda.
  • Con T const* , parece más fácil perder el * como T* const (especialmente si la gente no está tan acostumbrada). Por el contrario, const* T no es una sintaxis legal.

¿Qué pasa con la regla de análisis de derecha a izquierda?

Con respecto a todo el argumento de análisis de derecha a izquierda que a la gente parece gustarle usar:como mencioné en un comentario a otra respuesta, const T& también se lee bien de derecha a izquierda. Es una referencia a una constante T. "T" y "constante" pueden funcionar como adjetivo o sustantivo. (Además, leyendo T const* de derecha a izquierda puede ser ambiguo ya que podría interpretarse incorrectamente como "puntero constante a T" en lugar de "puntero a T constante".)


No hay diferencia ya que const se lee de derecha a izquierda con respecto a &, por lo que ambos representan una referencia a una instancia de Fred inmutable.

Fred& const significaría que la referencia en sí es inmutable, lo cual es redundante; cuando se trata de punteros constantes, ambos Fred const* y Fred* const son válidos pero diferentes.

Es una cuestión de estilo, pero prefiero usar const como sufijo ya que se puede aplicar consistentemente incluyendo funciones de miembros const.


Aunque son lo mismo, para mantener la coherencia con la regla DERECHA-IZQUIERDA sobre el análisis de declaraciones C y C++, es mejor escribir Fred const &arg

Consulte también esto para desarrollar una mayor comprensión sobre declaraciones, calificadores y declarantes.