Подтвердить что ты не робот

О преобразовании С++: неизвестное преобразование для аргумента 1 из '[some_class]' в '[some_class] &

Я работаю над С++ и ошибся, что не знаю точно, почему. Я нашел решение, но все еще хочу знать, почему.

    class Base
    {
        public:
               void something(Base& b){}
    };

    int main()
    {
        Base b;
        b.something(Base());
        return 0;           
    }

когда я компилирую код, я получил следующую ошибку:

abc.cpp:12:20: error: no matching function for call to ‘Base::something(Base)’
abc.cpp:12:20: note: candidate is:
abc.cpp:6:7: note: void Base::something(Base&)
abc.cpp:6:7: note:   no known conversion for argument 1 from ‘Base’ to ‘Base&’

но когда я заменил b.something(Base()) на

Base c;
b.something(c);

ошибка ушла, мне интересно, почему??? разве они не имеют один и тот же тип? Это имеет значение только для того, как я пишу это, но смысл должен быть тем же самым.

Спасибо, ребята!

4b9b3361

Ответ 1

Вы передаете временный объект Base здесь:

b.something(Base());

но вы пытаетесь связать это с ссылкой на не-const lvalue:

void something(Base& b){}

Это запрещено в стандартном С++. Вам нужна ссылка const.

void something(const Base& b){}

Когда вы это сделаете:

Base c;
b.something(c);

вы не проходите мимо временного. Неконстантная ссылка привязывается к c.

Ответ 2

В первом случае вы пытаетесь передать ссылку (не const) на временный аргумент функции, которая невозможна. Во втором случае вы передаете ссылку на существующий объект, который является абсолютно допустимым.