【发布时间】:2021-05-21 09:09:29
【问题描述】:
我对某些编译器如何工作的一般想法是,在类型检查阶段(语义分析),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);
可以将不同类型的完美组合传递给此函数。那么,ASTa和b的类型转换注解是如何处理的呢?函数是否因调用它的可能不同类型而重复?函数是否内联?
【问题讨论】:
-
我明白你的意思,但
float不是最好的例子,因为它是一种内在类型。即,没有float.operator+(float)。 -
请考虑
test不是函数。它只是一个模板。仅当您实例化它时,例如test<int,double>,这就是一个或多或少类似于任何其他函数的函数 -
什么是
Bbtw?错字,应该是void test(T a, B b) {? -
cppinsights.io 可能会有所帮助。
标签: c++ templates compiler-construction