この場合、C++は関数のオーバーロードをどのように処理しますか?
#include <iostream>
void func(int x)
{
std::cout << "integer";
}
void func(short x)
{
std::cout << "short";
}
int main(void)
{
func(3);
}
出力:整数
何故ですか?
定数にも型があります。そして、そうでないことを示す接尾辞なしで、3
は、単にint
定数です。定数が大きすぎる場合、コンパイラはより大きな型を選択しますが、デフォルトではint
より小さいものには向いていません。
これで、短い定数を作成するための接尾辞がなくなりました。特定のオーバーロードを呼び出す場合は、キャストを追加する必要があります。
リテラル3
は定数であり、言語設計により暗黙的にint
型になります。
short
オーバーロード関数の実行には、short
変数を使用する必要があります。
short s = 3;
fun(s);
または定数を適切にキャストします。
fun((short)3);
fun(static_cast<short>(3));
タイプshort
には、たとえばlong
(long l = 42L;
)が、作成できます。
なぜなら3
は整数です。
fun(static_cast<short>(3));
ショートバージョンを呼び出します。
または、ユーザー定義のリテラルを使用して短縮することもできます。 here を参照してください
定数3
には独自の型があり、この場合はint
です。オーバーロードを実行する場合は、定数をshort
に明示的にキャストする必要があります
fun((short)3);
あなたがやっている
fun(3);
および3はリテラル定数整数オーバーロードによりよく一致する関数はこれです
void fun(int x)
{
std::cout << "integer";
}
次のようなタイプのキャストを自由にプレイしてください。
fun(short(3));
fun(int(3));
// C++11
auto x = 3;
fun(x);