短いバージョン: 足し算はあるが掛け算はない数学的構造があるので、心配する必要はありません。表現している数学的構造にとって意味のある演算子をオーバーロードします。誰かが乗算を 2 回試みた場合、そのエラーno match for operator* in ...
は C++ プログラマーにとって理にかなっているはずです。なぜ 2 倍にならないのか、本当に当惑すると思われる場合は、ドキュメントを詳しく説明してください。特定のクラスに対して演算子が意味をなさない理由を知り、それをエラーメッセージで表現するのは、実際にはコンパイラの仕事ではないと思います。
長いバージョン: 大まかに言えば、「算術演算子」を持ち、群である集合の数学用語です+
(-
通常、演算子+
が可換でない限り、群演算子の記号を使用しないため、アーベル群)。掛け算を持ち、足し算を持たない集合も、集合から外せば群になることができます0
。足し算と掛け算は構造的に似ています。重要な違いは、掛け算は通常、反転 ( 0
) のない要素を少なくとも 1 つ受け入れるのに対し、足し算は通常受け入れないことです。
+
は、自然数の加算、シーケンスの連結、さらには和集合などの記号として使用されることもあります。これらの要素には一般に逆数がありません。その場合、グループすらなく、バイナリ関数だけがあり、 unary-
を定義せず、バイナリも定義しない可能性があります-
。このような場合、間違いなく+
演算子の選択は不適切ですが、保存するには遅すぎますstd::string
。
あなたのグループが+
と も-
持ち、と*
の間の関係に関する特定の条件を満たしている場合、それはring、または加法的恒等式を除くすべての要素が乗法逆数を持っている場合 (したがって行儀の良い を持っている場合) は体です。+
*
/
時間に関しては、絶対時間と継続時間という 2 つの異なる概念を考慮すると役立つことがよくあります。2 つの期間 (期間を指定する)、または絶対時間と期間 (絶対時間を指定する) を合計することはできますが、2 つの絶対時間を合計しても意味がありません (「先週の月曜日と次の木曜日」とは何ですか?)。
この動作が、ポインター (絶対時間の代わり) および整数 (期間の代わり) で定義された演算子に似ているのは、まったくの偶然ではありません。できますが(char*)0 + 0
、できません(char*)0 + (char*)0
。したがって、絶対時間には加法はありませんが、operator+(abstime, abstime)
ある可能性がありoperator+(abstime, duration)
ます。
期間は数字に似ていますが、物理的な次元があります。期間に無次元数 ( ) を掛けることは理にかなってい2.4 * 3s == 7.2s
ますが、2 つの期間を乗算することはめったにありません。単位が秒の 2 乗であるため、結果は期間ではありません。