Почему void B :: f () const & выбирается, когда B :: f вызывается временным объектом B? - PullRequest
0 голосов
/ 26 октября 2018
#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 & выбран в таком случае?

1 Ответ

0 голосов
/ 26 октября 2018

Поскольку 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);
}
...