是否在c++中正确过载电源

Overload power with correctly in c++?

本文关键字:电源 c++ 是否      更新时间:2023-10-16

在c++中,我实现了一个integer类,并将operator ^重载为幂函数。

integer integer::operator^ (const integer& rhs){
return integer(pow(this->.i, rhs.i));
}

这对于两个操作数是正确的。

integer i1, i2, i3 ;   
i4 = i1 ^ i2 ^ i3;  

i4的值在数学上是错误的,因为结合性需要从右到左。我该如何解决这个问题?如何更改关联性?

我得到了合理的答案,我学到了:

-We can't change  associativity or priority of an operator.   
-Good is Not to overload operators to do something conceptually different to 
the built-in versions  
-Even compiler can't support; it hard to implement!  

您不能通过重载来更改C++中运算符的关联性或优先级。这些规则是硬连接到语言语法中的。

C++标准说(§13.5.6,强调矿):

运算符函数应为非静态成员函数或非成员函数,并具有至少一个参数,其类型为类、对类的引用、枚举或对枚举无法更改运算符的优先级、分组或操作数运算符=,(一元)&,和,(逗号),为每种类型预先定义,可以更改[…]

^运算符不仅是左关联的,而且它的优先级也很低。幂运算符的正确优先级应该高于乘法(因此该表中的优先级为4或更好),但它的优先级为10——这意味着即使是加法和减法也要在它之前进行评估。1 + 2 ^ 3 * 4将被解析为(1 + 2) ^ (3 * 4),而数学上正确的幂运算符应被解析为1 + (2 ^ 3) * 4

如果一个运算符的关联性或优先级可以被修改,那么一个巨大的语法混乱就会随之而来。我的个人意见是,你不应该试图让^运算符过载,把它用作电源运算符。我宁愿在类上创建一个power方法。