Constante de referência qualificador em uma função de membro [duplicado]
-
21-12-2019 - |
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?
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.