【问题标题】:How does template specialisation work?模板专业化如何工作?
【发布时间】:2017-11-27 04:25:31
【问题描述】:

考虑以下简单代码:

template<typename U>
U foo(U a, U b){
    //we don't really care about the body
    return a + b;
}

和实例化:

int a = foo(1, 2);

我了解编译时, foo 是专门的,编译器会生成:

int foo(int a, int b){
    //we don't really care about the body
    return a + b;
}

编译器生成此专用代码的顺序是什么?

例如,我知道如果 U 没有 '+' 运算符,那么代码将无法编译,因此会执行一些成员函数表检查,并在某个时候生成函数签名。

返回类型、参数、操作等是否有特殊的求值顺序?

【问题讨论】:

  • "是否编译正确" 如果编译不正确,则不会进行任何特化。
  • 我已调整问题以澄清我的意图。
  • 你试过编译你的代码吗?
  • 编译器不会从损坏的代码中生成任何东西!
  • 我将代码更改为可以编译的代码。现在请考虑实际问题,而不是示例代码。

标签: c++ templates compilation


【解决方案1】:

这不是专业化,这是实例化。

模板分两次管理。

第一个几乎是句法;编译器只是验证代码是否正确。

然后,当您将模板(实例化)与给定或推导类型一起使用时,它会尝试生成代码(如果尚未完成),因此当遇到a+b 时,它只会尝试为涉及的类型。如果未找到,则会发出错误,否则会发出代码(最终可能会发生一些其他错误)。

【讨论】:

  • 所以这是在编译之前?预处理器会处理这个吗?
  • 不,它是编译器,参见标准部分 2.2 翻译阶段翻译单元实例化单元的概念。
  • 谢谢,我会的
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多