Рассмотрим этот код:
#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();
}
который печатает
A::f
B::f const &
Для B
выбирается перегрузка const, а не константа. Я предполагаю, что это означает, что указание lvalue ref refifier для * это отличается от того, что вообще не указывается. Почему это? Изменяется ли тип изменения "неявный этот аргумент" и перегрузка const, становится лучшим кандидатом при разрешении перегрузки?