Const referencia calificador en un miembro de la función [duplicar]
-
21-12-2019 - |
Pregunta
He visto en una respuesta allí:Es devuelta por el r-value de referencia más eficiente?
El miembro de la definición de la función:
Beta_ab const& getAB() const& { return ab; }
Estoy familiarizado con el cv-qualifier (const
) en las funciones miembro, pero no const&
.
Lo que hace el último const&
significa esto?
Solución
El &
es un ref-qualifier.Ref-calificadores de nuevo en C++11 y aún no se admiten en todos los compiladores, por lo que no los vea, que a menudo en la actualidad.Se especifica que esta función sólo puede ser llamado en lvalues (y no en rvalues):
#include <iostream>
class kitten
{
private:
int mood = 0;
public:
void pet() &
{
mood += 1;
}
};
int main()
{
kitten cat{};
cat.pet(); // ok
kitten{}.pet(); // not ok: cannot pet a temporary kitten
}
Combinado con la cv-calificador const
, que significa que usted sólo puede llamar a esta función miembro en lvalues, y estos pueden const.
Otros consejos
Sabemos que en este código...
Beta_ab const& getAB() const { return ab; }
^^^^^
El resaltado const
significa que la función miembro puede ser llamado un const
objeto.Una función miembro puede siempre ser llamados no-const
objeto, independientemente de la función de la cv-calificación.
Así que en este código...
Beta_ab const& getAB() const & { return ab; }
^
Debemos esperar que el resaltado &
también dice algo acerca de qué tipos de objetos de esta función miembro es permitido para ser llamados.Estaríamos en lo correcto;en C++11, esto nos dice que la función de miembro sólo podrán ser llamados lvalues.
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
En el ejemplo anterior, la primera de sobrecarga se invoca en lvalues, y el segundo de sobrecarga se invoca en la no-const
rvalues.Similar al siguiente ejemplo más familiar, con los calificadores se aplica a los parámetros de la función:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
Funciona de forma ligeramente diferente para el común de los parámetros, aunque, como en este ejemplo, el primer sobrecarga de aceptar una r-value si la segunda sobrecarga fueron retirados.