Почему void B :: f () const & amp; выбирается, когда B :: f вызывается временным объектом B?

#include <iostream>

struct A
{
void f() const &
{
std::cout << "A::f()&" << std::endl;
}

void f() const &&
{
std::cout << "A::f()&&" << std::endl;
}
};

struct B
{
void f() const &
{
std::cout << "B::f()&" << std::endl;
}
};

int main()
{
A{}.f();
B{}.f();
}

Выход:

A :: F ()&&

B :: F ()&

Обратите внимание, что void B::f() const && не существует

Для меня временный объект B звонки B::f, void B::f() const && должен быть выбран, или ошибка компилятора должна возникнуть.

Почему void B::f() const & выбрал в таком случае?

3

Решение

Так как 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 аргумент в ваших примерах.

Для меня временный объект B вызывает B :: f, void B :: f () const && должен быть выбран, или ошибка компилятора должна возникнуть.

если это было так, то код как следующий прервется без существующей перегрузки [const] rvalue.

void f(const int& i)
{
std::cout << i;
}

int main()
{
f(3);
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]