Почему мой перегруженный оператор запятой не становится названным?

Я пытаюсь перегрузить оператор запятой с недругом не являющаяся членом функция как это:

#include <iostream>
using std::cout;
using std::endl;

class comma_op
{
    int val;

public:
    void operator,(const float &rhs)
    {
        cout << this->val << ", " << rhs << endl;
    }
};

void operator,(const float &lhs, const comma_op &rhs)
{
    cout << "Reached!\n";      // this gets printed though
    rhs, lhs;                  // reversing this leads to a infinite recursion ;)
}

int main()
{
    comma_op obj;
    12.5f, obj;

    return 0;
}

В основном я пытаюсь получить оператор запятой, применимый от обеих сторон с плаванием. Наличие функции членства только позволяет мне писать obj, float_val, при наличии дополнительного недруга помощника не являющаяся членом функция позволяет мне писать float_val, obj; но членская функция оператора не становится названной.

GCC кричит:

comma.cpp: In function ‘void operator,(const float&, const comma_op&)’:
comma.cpp:19: warning: left-hand operand of comma has no effect
comma.cpp:19: warning: right-hand operand of comma has no effect


Примечание: Я понимаю что, перегружая операторы, что также к запятой перегрузки op., сбивает с толку и нисколько не желателен с точки зрения пуриста. Я просто изучаю нюансы C++ здесь.

6
задан legends2k 27 January 2016 в 22:26
поделиться

1 ответ

void operator,(const float &rhs)

Здесь нужен const.

void operator,(const float &rhs) const {
    cout << this->val << ", " << rhs << endl;
}

Причина в том, что

rhs, lhs

вызовет

rhs.operator,(lhs)

Поскольку rhs является const comma_op&, метод должен быть const методом. Но вы предоставили только не const оператор, поэтому будет использовано определение по умолчанию.

19
ответ дан 8 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: