我在询问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)。我很好奇这个规则。
它始终是最佳匹配吗?
声明的顺序是否重要?
在任何情况下都会应用数据类型转换?
规则设计时的关注点是什么?
答案 0 :(得分:5)
它始终是最佳匹配吗?
是的:1
是int
。如果存在适当的重载,则将 ,因为这会最小化必要的隐式转换次数(无)。
声明的顺序是否重要?
没有。但是,重要的是在调用之前是否已声明了函数。如果在调用之后声明函数,则不会考虑重载解析。
在任何情况下都会应用数据类型转换?
此处没有转化,因为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)
有类型常量,例如1u
为unsigned 1
,1l
为long 1
,双{({1}})为{} float(1.0
)。