web-dev-qa-db-ja.com

リテラル3を渡すと、短いオーバーロードではなくintオーバーロードが選択されるのはなぜですか?

この場合、C++は関数のオーバーロードをどのように処理しますか?

#include <iostream>

void func(int x)
{
   std::cout << "integer";
}

void func(short x)
{
   std::cout << "short";
}

int main(void)
{
   func(3);
}

出力:整数

何故ですか?

27
Gaurav

定数にも型があります。そして、そうでないことを示す接尾辞なしで、3は、単にint定数です。定数が大きすぎる場合、コンパイラはより大きな型を選択しますが、デフォルトではintより小さいものには向いていません。

これで、短い定数を作成するための接尾辞がなくなりました。特定のオーバーロードを呼び出す場合は、キャストを追加する必要があります。

59
StoryTeller

リテラル3は定数であり、言語設計により暗黙的にint型になります。

shortオーバーロード関数の実行には、short変数を使用する必要があります。

short s = 3;
fun(s);

または定数を適切にキャストします。

fun((short)3);
fun(static_cast<short>(3));

タイプshortには、たとえばlonglong l = 42L;)が、作成できます。

29
kocica

なぜなら3は整数です。

fun(static_cast<short>(3));

ショートバージョンを呼び出します。

または、ユーザー定義のリテラルを使用して短縮することもできます。 here を参照してください

17
doctorlove

定数3には独自の型があり、この場合はintです。オーバーロードを実行する場合は、定数をshortに明示的にキャストする必要があります

fun((short)3);
6
Boris

あなたがやっている

fun(3);

および3リテラル定数整数オーバーロードによりよく一致する関数はこれです

void fun(int x)
{
    std::cout << "integer";
}

次のようなタイプのキャストを自由にプレイしてください。

fun(short(3));
fun(int(3));
// C++11
auto x = 3;
fun(x);