我正在尝试使用非友好的非成员函数重载逗号运算符,如下所示:
#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
;但是不会调用成员操作符函数。
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
注意:
我意识到重载运算符,这也会使逗号超载,令人困惑,从纯粹主义者的角度来看也是不可取的。我只是在这里学习C ++的细微差别。
答案 0 :(得分:19)
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
operator,
,因此将使用默认定义。