gpt4 book ai didi

c++ - C++中的转换优先级

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:26 24 4
gpt4 key购买 nike

我有以下代码:

Some functions:

A::A(int i_a) {cout<<"int Ctor\n";} //conversion constructor

void h(double d) {cout<<"double param\n";} //f1
void h(A a) {cout<<"A param\n";} //f2

在主函数中:

h(1);

h(1)调用的函数是f1。

我的问题是它为什么选择调用它。 1 是一个 int,因此需要隐式转换为 double。它可以很容易地将 int 转换为 A 使用上面定义的转换构造函数。为什么我没有得到错误?什么是类型转换的优先规则?


注意我已经在上面发布了我认为回答问题所必需的代码,但在下面我发布了整个代码:

 #include <iostream>
using namespace std;
class B;
class A {
public:
explicit A(const B&) {cout<<"Ctor through B\n";}
A() {cout<<"Default Ctor\n";}
A(int i_a) {cout<<"int Ctor\n";}
operator int() {cout<<"A => int\n"; return 2;}
};
class B {
public:
operator A() const {cout<<"B => A\n"; A a; return a;}
};
void h(double d) {cout<<"double param\n";}
void h(A a) {cout<<"A param\n";}
void f(const A& a)
{
cout<<"f function\n";
//Without the const it will never try to convert
}
void main()
{
B b;
cout <<"-----------------\n";
f(b);
cout <<"-----------------\n";
h(1);
}

最佳答案

当执行重载决策以从所有可行的重载中选择最佳候选者时 - 编译器对每个候选者的每个参数的所有转换序列进行排序。对于获胜的函数(被选为最佳候选者),其每个参数的转换等级必须优于或等于该参数的所有其他函数的转换等级,并且至少一个转换等级必须优于所有其他转换等级函数对特定参数的转换等级。

用户定义的转换(使用构造函数或强制转换运算符)具有最差的排名之一(只有省略号具有更差的排名)。积分 float 转换具有更好的排名(排名列表见下文)。

因此,编译器更喜欢转换 int -> double(使用标准转换)而不是转换 int -> A(使用用户定义的转换),因此它选择 f1。

编辑:虽然“过载解决”在后台工作,并且大部分时间都完全符合您的预期(即大多数程序员不需要深入研究技术细节)——如果您确实想更深入(但警告过载决议的一些较暗角落被认为是编译器编写者在 C++ 编译器中完全正确的最棘手的方面之一)请参阅优秀的 C++ Templates: The Complete Guide by David Vandevoorde and Nicolai M. Josuttis它在附录 B 中提供了我读过的关于重载决议背后机制的最佳介绍之一。

这是 B.2 的摘录:

Overload resolution ranks the viablecandidate functions by comparing howeach argument of the call matches thecorresponding parameter of thecandidates. For one candidate to beconsidered better than another, thebetter candidate cannot have any ofits parameters be a worse match thanthe corresponding parameter in theother candidate....

Given this first principle, we areleft with specifying how well a givenargument matches the correspondingparameter of a viable candidate. As afirst approximation we can rank thepossible matches as follows (from bestto worst):

Perfect match. The parameter has thetype of the expression, or it has atype that is a reference to the typeof the expression (possibly with addedconst and/or volatile qualifiers).

Match with minor adjustments. Thisincludes, for example, the decay of anarray variable to a pointer to itsfirst element, or the addition ofconst to match an argument of typeint** to a parameter of type intconst* const*.

Match with promotion. Promotion is akind of implicit conversion thatincludes the conversion of smallintegral types (such as bool, char,short, and sometimes enumerations) toint, unsigned int, long or unsignedlong, and the conversion of float todouble.

Match with standard conversions only.This includes any sort of standardconversion (such as int to float) butexcludes the implicit call to aconversion operator or a convertingconstructor.

Match with user-defined conversions.This allows any kind of implicitconversion.

Match with ellipsis. An ellipsisparameter can match almost any type(but non-POD class types result inundefined behavior).

但这只是开始 - 如果您感兴趣 - 我强烈建议您先阅读本书,然后再阅读标准的相关部分 :)

关于c++ - C++中的转换优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com