必要性を感じたら過負荷になることがあります。事前定義されたすべてのタイプでは、基本的に何もしません。
No-op単項算術演算子の実際の使用はかなり制限されており、演算子自体ではなく、算術式で値を使用した結果に関連する傾向があります。たとえば、小さい整数型からint
への強制的な拡張に使用したり、式の結果が右辺値として扱われるため、const
以外の参照パラメーターと互換性がないことを確認できます。ただし、これらの用途は、読みやすさよりもゴルフのコード化に適していると申し上げます。 :-)
実際、単項プラスdoesは何かを行います-Cであっても、usualを実行しますオペランドの算術変換は、新しい値を返します。この値は、より大きな幅の整数にすることができます。元の値がint
より小さい幅の符号なし整数であった場合、signed
値にも変更されます。
通常、これはそれほど重要ではありませんが、canは効果があるため、not整数が正であることを示す一種の「コメント」として単項プラスを使用することをお勧めします。次のC++プログラムを検討してください。
void foo(unsigned short x)
{
std::cout << "x is an unsigned short" << std::endl;
}
void foo(int x)
{
std::cout << "x is an int" << std::endl;
}
int main()
{
unsigned short x = 5;
foo(+x);
}
これにより、「xはint」と表示されます。
したがって、この例では、単項プラスは、異なるタイプandの符号付きの新しい値を作成しました。
K&R第2版から:
単項+はANSI標準で新しく追加されました。単項との対称性のために追加されました-。
明確にするために、正の値を負の値と区別して強調するために使用しているのを見ました:
shift(+1);
shift(-1);
しかし、それはかなり弱い使用です。答えは間違いなく過負荷です。
組み込みの単項+
は、左辺値を右辺値に変換します。たとえば、これを行うことができます
int x;
&x;
しかし、あなたはこれを行うことはできません
&+x;
:)
追伸「オーバーロード」は間違いなく正しい答えではありません。単項+
はCから継承されており、Cにはユーザーレベルの演算子のオーバーロードはありません。
単項+が達成する主なことは、intよりも小さいデータ型のintへの型昇格です。これは、std::cout
を数値データとして使用してcharデータを印刷する場合に非常に役立ちます。
char x = 5;
std::cout << +x << "\n";
とは非常に異なります
char x=5;
std::cout << x << "\n";
オーバーロードにも使用できますが、実際にはオーバーロードshouldはほぼNOPです。
デバッグなどの理由で生バイトの数値(たとえば、charとして格納された小さな数値)を印刷する必要がある場合、単項+は印刷コードを単純化できます。検討する
char c = 42;
cout << c << endl; // prints "*\n", not what you want in this case
cout << (int)c << endl; // prints "42\n", ok
cout << +c << endl; // prints "42\n", much easier to type
これは簡単な例です。単項+が、バイトをテキストではなく数字のように扱うのに役立つ場合が他にもあると確信しています。
歴史的な情報。 C99標準化委員会は、言語の別の機能である浮動小数点定数式の翻訳時評価の禁止を再利用することを検討したことからもわかるように、既存の単項プラスの使用はかなりまれであると考えました。 Cの根拠、セクションF.7.4からの次の引用を参照してください。
この仕様の初期バージョンでは、変換時定数演算が許可されていましたが、オペランドに適用されると、単項+演算子が定数式の変換時評価を禁止するようになりました。
最終的に、セマンティクスは逆になり、ほとんどのコンテキストで実行時評価が実行され(少なくとも「あたかも」ルールまで)、静的初期化子を使用して翻訳時評価を実行することができました。主な違いは、浮動小数点例外の発生と、他の浮動小数点の丸めまたは精度設定(存在する場合)にあることに注意してください。
単項プラスはCに存在し、そこではまったく何もしませんでした(auto
キーワードによく似ています)。それを持たないためには、StroustrupはCとの不整合を導入する必要がありました。
C++になったら、単項マイナスのようにオーバーロード関数を許可するのが自然であり、Stroustrupがその理由でそれがまだない場合はそれを導入した可能性があります。
だから、それは何も意味しません。たとえば、-1.5の反対に+1.5を使用して、物事をより対称的に見せるための装飾の一種として使用できます。 C++では、オーバーロードされる可能性がありますが、operator+()
が何かを行うと混乱を招きます。標準的なルールを覚えておいてください:算術演算子をオーバーロードするときは、int
sのようなことをしてください。
そこにある理由を探しているなら、Cの初期の歴史について何かを見つけてください。Cは実際には設計されていなかったので、正当な理由はなかったと思います。役に立たないauto
キーワード(おそらくstatic
とは対照的に、現在C++ 0xでリサイクルされている)と、entry
キーワードを検討してください。 C90)。 RitchieまたはKernighanが、オペレーターの優先順位に問題があることに気付いたときに、破壊を望まない数千行のコードを含む3つのインストールが既にあったと言っている有名な電子メールがあります。
あまりない。 operator+()
のオーバーロードを許可する一般的な議論は、operator-()
をオーバーロードするために実際に使用されることは間違いなく、very weird(or asymmetrical) operator-()
ではなくoperator+()
のオーバーロードを許可する場合。
最初にStroustropからこの議論を読んだと思うが、それを検証する権利を自分の本に持っていない。間違っているかもしれない。
私はこれのソースを引用することはできませんが、ロスレス型変換を意味する明示的な型プロモーションのためであることを理解するようになりました。これにより、変換階層の最上位に配置され、
new_type operator+(old_type)
new_type(old_type)
operator(new_type)(old_type)
new_type operator=(old_type)
もちろん、それは約15年前に読んだMicrosoft(本当に古い)c/c ++マニュアルの1つにあるメモの解釈からです。
#include <stdio.h>
int main()
{
unsigned short x = 5;
printf ("%d\n",sizeof(+x));
printf ("%d\n",sizeof(x));
return 0;
}
上記の例に示すように、単項+は、実際にそれぞれタイプ4と2を変更します。表現+ xが実際にsizeofで計算されるのは奇妙なことです。おそらく、sizeofが単項+と同じ優先順位を持っているという事実によるものです。
常に正の数にするために使用できると思います。単項演算子+をオーバーロードしてabsにします。コードを難読化したいだけでない限り、仲間の開発者を混乱させるほどの価値はありません。その後、うまく動作します。