为什么传递文字3选择int重载而不是短过载?

时间:2017-08-08 09:17:49

标签: c++ overloading

在这种情况下,C ++如何处理函数重载?

#include <iostream>

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

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

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

输出:整数

为什么?

5 个答案:

答案 0 :(得分:59)

常量也有类型。如果没有后缀表示其他情况,3只是int常量。如果常量太大,编译器将选择更大的类型,但默认情况下它不会选择小于int的值。

现在,它恰好发生了,没有后缀来制作一个短常量。如果您希望调用特定的重载,则需要添加强制转换。

答案 1 :(得分:29)

3具有常量,并且隐式具有类型int

对于short重载函数执行,您必须使用short var或recast常量。

short s = 3;
fun(s);

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

short没有long - L这样的后缀,但你可以创建一个。

答案 2 :(得分:17)

因为3是一个整数。

fun(static_cast<short>(3));

会拨打简短版本。

或者您可以使用用户定义的文字缩短:请参阅here

答案 3 :(得分:6)

你在做什么

fun(3);

3 是一个文字常量整数 ,所以更好地匹配重载的函数是这个

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

随意玩这些类型的小玩意儿并投下如下:

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

答案 4 :(得分:6)

常量3拥有自己的类型,在这种情况下它是int。如果希望执行重载

,则需要将常量显式转换为short
fun((short)3);