3

C ++では、integerクラスを実装しoperator ^、べき関数になるようにオーバーロードしました。

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

これは、2つのオペランドに対して正しく機能しています。

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!  
4

1 に答える 1

11

演算子をオーバーロードして、C++の演算子の結合性または優先度を変更することはできません。これらのルールは、言語構文に組み込まれています。

C ++標準によると(§13.5.6、強調鉱山):

演算子関数は、非静的メンバー関数または非メンバー関数のいずれかであり、タイプがクラス、クラスへの参照、列挙型、または列挙型への参照であるパラメーターを少なくとも1つ持つ必要があります。演算子の優先順位、グループ化、またはオペランドの数を変更することはできません。 タイプごとに事前定義された演算子=、(単項)&、および、(コンマ)の意味は変更できます[...]

^演算子は左結合であるだけでなく、優先順位も非常に低くなっています。累乗演算子の正しい優先順位は、乗算よりも高くする必要があります(したがって、この表では優先順位4以上)が、優先順位10があります。これは、加算と減算でさえその前に評価されることを意味します。1 + 2 ^ 3 * 4はとして解析されますが(1 + 2) ^ (3 * 4)、数学的に正しい電力演算子はとして解析する必要があります1 + (2 ^ 3) * 4

演算子の結合性または優先順位を変更できる場合、巨大で巨大な構文上の混乱が発生します。私の謙虚な意見は^、パワーオペレーターとして使用するためにオペレーターに過負荷をかけようとすべきではないということです。私はむしろpowerクラスでメソッドを作りたいです。

于 2012-11-15T17:45:37.360 に答える