Поскольку void B::f() const &&
не существует, выбирается следующий лучший кандидат - ваш void B::f() const &
.Значение будет привязано к const &
.Если вы удалите const, вы заметите, что получите ошибку компиляции, поскольку rvalue не может привязаться к неконстантной ссылке.Пример cppreference / overloadresolution отлично это показывает.
int i;
int f1();
int g(const int&); // overload #1
int g(const int&&); // overload #2
int j = g(i); // lvalue int -> const int& is the only valid conversion
int k = g(f1()); // rvalue int -> const int&& better than rvalue int -> const int&
Это не отличается для неявного аргумента this
в ваших примерах.
Комуme, должен быть выбран временный объект B, вызывающий B :: f, void B :: f () const && или возникнет ошибка компилятора.
, если это так, то кодкак после прервется без существующей перегрузки [const] rvalue.
void f(const int& i)
{
std::cout << i;
}
int main()
{
f(3);
}