【问题标题】:How does C++ handle template functions with respect to type conversionsC++ 如何处理关于类型转换的模板函数
【发布时间】: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);

可以将不同类型的完美组合传递给此函数。那么,ASTab的类型转换注解是如何处理的呢?函数是否因调用它的可能不同类型而重复?函数是否内联?

【问题讨论】:

  • 我明白你的意思,但float 不是最好的例子,因为它是一种内在类型。即,没有float.operator+(float)
  • 请考虑test 不是函数。它只是一个模板。仅当您实例化它时,例如test&lt;int,double&gt;,这就是一个或多或少类似于任何其他函数的函数
  • 什么是B btw?错字,应该是void test(T a, B b) { ?
  • cppinsights.io 可能会有所帮助。

标签: c++ templates compiler-construction


【解决方案1】:

函数是否因调用它的可能不同类型而重复?

是的。这大致就是编写模板的想法。 test 不是函数,test&lt;int,double&gt; 是。

以下并不是真正发生的事情,但它在一定程度上可以作为一种心智模型。

你打电话

test(1,1.0);

编译器推断TB 分别为intdouble。因此它会按照以下方式实例化一些东西:

void test(int a, double b) {
    a + b;
}

现在只需要编译器并拥有查看a+b 是否需要提升操作数之一所需的所有信息。通常的规则确实适用:https://en.cppreference.com/w/cpp/language/implicit_conversion

【讨论】:

  • 谢谢,这是有道理的。我在模板函数中声明了一个静态 int 并将其递增。对模板化函数的唯一调用返回 1,当我两次输入相同类型时返回 2。
猜你喜欢
  • 2012-08-23
  • 2014-04-28
  • 2021-05-12
  • 1970-01-01
  • 2019-11-10
  • 2011-12-16
  • 2021-05-08
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多