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

C++中的函数静态绑定 我问的是C++中函数的静态绑定。函数绑定的数据类型转换规则是什么,c++,C++,假设我们有 void func(int x); void func(long x); void func(float x); void func(double x); void func(char x); 我主要有一个功能 func(1) 我知道函数functint x将被调用。我很好奇这方面的规则 这总是最好的比赛吗 申报顺序重要吗 在任何情况下,是否应用数据类型转换 设计规则时需要考虑什么?常量1的类型为int,因此最好的匹配是void funcint。声明的顺序不影响。当存在最佳匹配时

假设我们有

void func(int x);
void func(long x);
void func(float x);
void func(double x);
void func(char x);
我主要有一个功能

func(1)
我知道函数functint x将被调用。我很好奇这方面的规则

这总是最好的比赛吗

申报顺序重要吗

在任何情况下,是否应用数据类型转换


设计规则时需要考虑什么?

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

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

有类型化常量,例如1u表示无符号1,1l表示长1,与double 1.0和float 1.0f相同。

有类型化常量,例如,对于无符号1,1L,长1的1L,同样的,双1和浮点1.0f。

在C++中,它总是最佳匹配。申报的顺序无关紧要。 是的,常数有类型转换。例如,如果编写另一个重载:

void func(std::string const& x);
然后打电话:

func("Hi there");

然后,编译器将使用funcstd::string const&x重载作为std::string contain构造函数使用char const*,并将其用作类型转换规则之一。然后,将临时STD::string构造并传递给FUNC。

< P> C++,它总是最佳匹配。申报的顺序无关紧要。 是的,常数有类型转换。例如,如果编写另一个重载:

void func(std::string const& x);
然后打电话:

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

这总是最好的比赛吗

是:1是一个int。如果存在适当的重载,则将采用该重载,因为这将最小化必需的隐式转换的数量

申报顺序重要吗

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

在任何情况下,是否应用数据类型转换

这里没有转换,因为int是完全匹配的。只有在没有精确匹配时,转换才会生效

设计规则时需要考虑什么

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

这总是最好的比赛吗

是:1是一个int。如果存在适当的重载,则将采用该重载,因为这将最小化必需的隐式转换的数量

申报顺序重要吗

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

在任何情况下,是否应用数据类型转换

这里没有转换,因为int是完全匹配的。只有在没有精确匹配时,转换才会生效

设计规则时需要考虑什么


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

也许还有:对于无符号的long 1,也有常量后缀1ull。代码看起来很有趣。所以你的意思是,常量没有类型转换?每个常量都有一个特定的类型。可能存在隐式转换。所以如果你做双a=0.1f;有一个从float到double的隐式转换。大多数情况下,编译器会在编译时对其进行优化并进行转换。但只有在需要转换的情况下才可以这样做。在您的示例中,它是不需要的,因此它也不会发生,即使不是偶然发生的;。可能还有:对于无符号long 1,还有常量后缀1ull。代码看起来很有趣。所以你的意思是,常量没有类型转换?每个常量都有一个特定的类型。可能存在隐式转换。所以如果你做双a=0.1f;有一个从float到double的隐式转换。大多数情况下,编译器会在编译时对其进行优化并进行转换。但只有在需要转换的情况下才可以这样做。在您的示例中,它是不需要的,因此它也不会发生,即使不是偶然发生的;。过载解决规则是C++中的一个复杂话题。例如,尝试删除char重载,并传递一个char。调用的函数是int版本。如果删除int函数后仍传递char,则调用将不明确。我想你只有这样
LLY掌握这些规则就是阅读标准。过载解决规则是C++中的一个复杂话题。例如,尝试删除char重载,并传递一个char。调用的函数是int版本。如果删除int函数后仍传递char,则调用将不明确。我认为你真正掌握这些规则的唯一方法就是阅读标准。