【问题标题】:C++ compiler parse the templates before instantiation? why?C++ 编译器在实例化之前解析模板?为什么?
【发布时间】:2015-01-16 08:21:12
【问题描述】:

在我看来,C++ 编译器甚至在模板被实例化之前就对其进行了解析。否则,这不能解释使用关键字 typename 将依赖名称声明为类型。换句话说,如果编译器仅在实例化时解析模板定义,我认为解释没有歧义

template < typename Foo >
struct ABC {
    Foo::iterator * i;
}

因此在 Foo::iterator 之前不需要 typename。

因此,我认为编译器会在实例化之前解析定义(类型 Foo 是已知的)。问题是,它为什么这样做?为什么不延迟到它被实例化并且所有类型都已知。

【问题讨论】:

标签: c++ templates


【解决方案1】:

在我看来,C++ 编译器甚至在模板被实例化之前就对其进行了解析。

这就是它的工作。它是一个编译器,而不是一个宏处理器。

如果编译器仅在实例化时解析模板定义,我认为解释没有歧义

其中一个问题是模板本身的错误不会被检测到,只要它只使用不触发错误的“友好”类型实例化:例如,如果模板假定类型总是有这样那样的方法。

【讨论】:

  • 模板当然可以选择假设它们的类型参数总是有一些方法——完全延迟解析的问题(就像 MSVC 已经使用了很长时间)是模板可能意味着基于不同的东西关于其参数的成员是 types、模板还是两者都不是。
【解决方案2】:

CRTP 否则将是一个问题。简而言之,这是合法的:

template <typename T> struct Base { };
struct Derived : Base<Derived> { };

显然,如果 Base&lt;Derived&gt; 只能在 Derived 编译后编译,我们就会遇到问题,因为 Derived 只能在 Base&lt;Derived&gt; 编译后编译。然而,Base&lt;T&gt; 的第 1 阶段编译足以编译 Derived。

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 2021-12-30
    • 2021-02-17
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多