C ++中的函数静态绑定

时间:2010-02-21 15:27:49

标签: c++

我在询问C ++中函数的静态绑定。什么是函数绑定的数据类型转换规则。

假设我们有

void func(int x);
void func(long x);
void func(float x);
void func(double x);
void func(char x);

我在main

中有一个功能
func(1)

我知道将调用函数func(int x)。我很好奇这个规则。

它始终是最佳匹配吗?

声明的顺序是否重要?

在任何情况下都会应用数据类型转换?

规则设计时的关注点是什么?

4 个答案:

答案 0 :(得分:5)

  

它始终是最佳匹配吗?

是的:1int。如果存在适当的重载,则 ,因为这会最小化必要的隐式转换次数(无)。

  

声明的顺序是否重要?

没有。但是,重要的是在调用之前是否已声明了函数。如果在调用之后声明函数,则不会考虑重载解析。

  

在任何情况下都会应用数据类型转换?

此处没有转化,因为int完全匹配。只有当没有完全匹配时,转换才会发挥作用。

  

规则设计时的关注点是什么?

嗯,这是唯一有意义的规则,不是吗?

答案 1 :(得分:4)

常量1的类型为int,因此最佳匹配为void func(int)。声明的顺序不会影响。当存在最佳匹配(没有歧义)但匹配和参数与参数的类型不同时,类型转换将发挥作用。

答案 2 :(得分:2)

在C ++中,它始终是最佳匹配。声明顺序无关紧要。 是的常量有类型转换。例如,如果您编写另一个重载:

void func(std::string const& x);

然后致电:

func("Hi there");

然后编译器将使用func(std::string const& x)重载,因为std::string包含构造函数char const *,并将其用作类型转换规则之一。然后构造临时的std :: string并传递给func。

答案 3 :(得分:1)

有类型常量,例如1uunsigned 11llong 1,双{({1}})为{} float(1.0)。