gpt4 book ai didi

c++ - 在 C++ 中正确地过载电源?

转载 作者:太空狗 更新时间:2023-10-29 19:53:30 25 4
gpt4 key购买 nike

在 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,强调我的):

An operator function shall either be a non-static member function or be a non-member function and have at least one parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration. It is not possible to change the precedence, grouping, or number of operands of operators. The meaning of the operators =, (unary) &, and , (comma), predefined for each type, can be changed [...]

不仅 ^ 运算符是左结合的,而且 it also has a very low precedence .幂运算符的正确优先级应该高于乘法(因此在此表中优先级为 4 或更高),但它的优先级为 10——这意味着甚至加法和减法都在它之前计算。 1 + 2 ^ 3 * 4 将被解析为 (1 + 2) ^ (3 * 4),而数学上正确的幂运算符应解析为 1 + (2 ^ 3) * 4

如果可以修改运算符的关联性或优先级,就会出现巨大的句法困惑。我的拙见是,您不应该尝试重载 ^ 运算符以将其用作幂运算符。我宁愿在类上创建一个 power 方法。

关于c++ - 在 C++ 中正确地过载电源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com