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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top