Considerate questo codice:Perché specificare un riferimento lvalue per * questo su una funzione membro è diverso dal non specificare nulla?
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A::f" << endl; }
void f() const { cout << "A::f const" << endl; }
};
struct B {
void f() & { cout << "B::f &" << endl; }
void f() const & { cout << "B::f const &" << endl; }
};
A getA() { return A{}; }
B getB() { return B{}; }
int main() {
getA().f();
getB().f();
}
che stampa
A::f
B::f const &
Per B
, viene selezionato il sovraccarico const, non quella non-const. Immagino che questo significhi che specificare un qualificatore di riferimento lvalue per * questo è diverso dal non specificare nulla. Perché? Il "implicito questo argomento" cambia tipo e il sovraccarico const diventa ora un candidato migliore nella risoluzione di sovraccarico?
'B :: f' viene chiamato su un' B && '. Dal momento che non è possibile convertire un riferimento di rvalore in un riferimento a lvalue (a meno che non si tratti di Visual Studio), non è possibile chiamare 'B :: f &'. Non so se 'A :: f' è uguale a' A :: f && '. – nwp
@nwp non lo è, 'A :: f() &&' può _only_ essere chiamato su rvalue. –
Il trucco qui è che ref-qualificatore 'const &' può legarsi a un valore! (rendendolo abbastanza inutile) –