Отсутствует оператор << соответствующий этим операндам

#include <iostream>


class X
{
public:
    X(int b)
    {
        this->b = b;
    }
    
    ~X()
    {
    }
    
    int b;

    friend X operator+ (const X&, const X&);

    friend std::ostream& operator<< (std::ostream&, X&);
};

X operator+ (const X& left, const X& right)
{
    X ret = left;
    ret.b += right.b;
    return ret;
}

std::ostream& operator<< (std::ostream& out, X& lst)
{
    out << lst.b;
    return out;
}

int main()
{
    X a(10);
    X b(20);
    std::cout << a + b;
    return 0;
}

вылетает

error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "X" (или приемлемое преобразование отсутствует)

Что в данном случае неверно? Оператор + возвращает как раз X который подходит под перегрузку <<


Ответы (1 шт):

Автор решения: Mikhailo

Все решается одним словом const. Вы неправы в одном -

Оператор + возвращает как раз X который подходит под перегрузку <<

он вернет временный X, rvalue, который никак под эту перегрузку не подходит. А подходит под эту:

std::ostream& operator<< (std::ostream&, const X&);
→ Ссылка