Ошибка при использовании конструктора

class Ctest
{
    public:
    int Dtest;
    Ctest (int _Dtest = 0 ) { Dtest = _Dtest; }
    void operator << (Ctest&);
}; 

void Ctest::operator << (Ctest& _Ctest)
{
    Dtest = _Ctest.Dtest;
};

Ctest _Ctest;

int main()
{
    _Ctest << Ctest(1);
}

оператор << не хочет работать, как заставить.

error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "Ctest" (или приемлемое преобразование отсутствует)
message : может быть "void Ctest::operator <<(Ctest &)"
message : при попытке сопоставить список аргументов "(Ctest, Ctest)"

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

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

В выражении

_Ctest << Ctest(1);

Ctest(1) это rvalue выражение. А дальше оно пытается вызвать перегруженный оператор <<, который принимает по ссылке. А обычная (lvalue) ссылка не может принять rvalue. Что делать? самый просто способ - сделать ссылку на константу

void Ctest::operator << (const Ctest& _Ctest)
{
    Dtest = _Ctest.Dtest;
};

или сделать вот такую перегрузку:

void Ctest::operator << (Ctest&& _Ctest)
{
    Dtest = _Ctest.Dtest;
};

Я бы делал const& и этого было бы достаточно. Но если объект "тяжелый" и для него можно написать хорошую функцию перемещения, то перегрузка и для rvalue - самое оно.

→ Ссылка