Pergunta

Eu já vi em um responde de lá:Está retornando pelo rvalue referência mais eficiente?

A definição de função de membro:

Beta_ab const& getAB() const& { return ab; }

Eu estou familiarizado com a cv-qualificador (const) em funções de membro, mas não const&.

O que faz o último const& significa?

Foi útil?

Solução

O & é um ref-qualificador.Ref-qualificadores são novas em C++11 e ainda não são suportados em todos os compiladores, assim você não ver que, muitas vezes, atualmente.Ele especifica que esta função só pode ser chamado em lvalues (e não no 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 com o cv-qualificador const, isso significa que você só pode chamar esta função de membro no lvalues, e esses podem ser const.

Outras dicas

Sabemos que, neste código,...

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

Destaque const significa que a função de membro pode ser chamado de um const objecto.Uma função membro pode sempre ser chamado de um não-const objeto, independentemente da função do cv-qualificação.

Então, nesse código...

Beta_ab const& getAB() const & { return ab; }
                             ^

É de se esperar que o destaque & também diz algo sobre que tipos de objetos esta função de membro é permitido para ser chamado.Nós seria correto;em C++11, este diz que a função de membro só pode ser chamado lvalues.

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

No exemplo acima, o primeiro é chamado de sobrecarga no lvalues, e o segundo é chamado de sobrecarga nãoconst rvalues.Semelhante ao seguinte exemplo mais familiar, com qualificadores aplicada a função comum de parâmetros:

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

Ele funciona de forma ligeiramente diferente para o comum dos parâmetros, porém, como neste exemplo, a primeira sobrecarga para aceitar um rvalue se a segunda sobrecarga foram removidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top