我对某些编译器如何工作的一般想法是,在类型检查阶段(语义分析),AST 使用类型转换信息进行注释,因此例如:1 + 1.2
,表示的节点1
将使用浮点数(或双精度)进行注释指示它必须被转换,以便它可以匹配函数调用operator+(float, float)
(或float.operator+(float)
)。
但是,当涉及模板化函数参数时,例如:
template<typename T, typename B>
void test(T a, B b) {
a + b;
}
...
test(23, 12);
test(23, 1.2);
test(2.3, 12);
test(2.3, 1.2);
可以将不同类型的大量组合传递给此函数。因此,如何是类型转换的AST的注释a
和b
处理?对于调用它的可能的不同类型,该函数是否重复?函数是内联的吗?
对于调用它的可能的不同类型,该函数是否重复?
是的。这大致就是编写模板的想法。test
不是函数,test<int,double>
是。
以下并不是真正发生的事情,但它在很大程度上可以作为一种心理模型。
你打电话
test(1,1.0);
编译器推导出T
和分别B
为int
和double
。因此,它将实例化以下内容:
void test(int a, double b) {
a + b;
}
只有现在编译器是必需的,并且具有查看是否a+b
需要提升操作数之一所需的所有信息。通常的规则确实适用:https : //en.cppreference.com/w/cpp/language/implicit_conversion
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句