首页 文章

模板专业化和实例化

提问于
浏览
7

这些概念对我来说有点不清楚 . 好吧,模板实例化的定义很好 N4296::14.7 [temp.spec]

实例化函数,类,类模板或成员模板的成员的行为称为模板实例化 .

那就是如果我们有一个函数/变量/类模板,模板的实例化只是创建一个对象或函数 . 例如:

template<typename T> class U{ };
U<int> a; //instantiation

N4296:14.7.1 [temp.inst] 说(强调我的):

除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全定义的对象类型的上下文中引用特化时或者当需要时,将隐式实例化类模板特化 . 类类型的完整性会影响程序的语义 .

模板特化的实例化定义是什么,而不仅仅是模板的实例化?

2 回答

  • -1

    “实例化模板特化”通常是指隐式实例化的过程:将特定模板参数替换为模板定义以获得实例化的类,函数等 . 实例化模板意味着实例化该模板的特化 . 通常,当我们在语言律师的背景下讨论一些任意的实例化时,使用不太精确的措辞 . 您还将找到表达式“模板的实例化”,它与实例化的特化相同 .

  • 2

    题:

    模板特化的实例化定义是什么,而不仅仅是模板的实例化?

    我的理解:

    没有模板实例化这样的东西 . 您始终实例化模板专业化 .

    如果你有:

    template <typename T> struct Foo {};
    
    Foo<int> foo;
    

    您已实例化模板特化 Foo<int> ,而不是模板 Foo .

    更新

    假设您有以下类模板:

    template <typename T> struct Foo
    {
       static int a;
    };
    
    int getNext()
    {
       static int n = 0;
       return ++n;
    }
    
    template <class T> int Foo<T>::a = getNext();
    

    Explicit template instantiation

    您可以使用以下命令创建 Foo<char>Foo<int> 的显式实例化:

    template struct Foo<char>;
    template struct Foo<int>;
    

    即使 Foo<char>Foo<int> 未在代码中的任何其他位置使用,也会为 charint 实例化类模板 .

    Explicit template specialization

    您可以使用以下命令创建类模板的显式特化:

    template <> Foo<double> {};
    

    Use of Foo

    现在,让我们看看 Foo 的使用 .

    Foo<int> f1;    // An explicit instantiation has already been created.
                    // No need for any further code creation.
    
    Foo<double> f2; // An explicit specialization has already been created.
                    // No need for any further code creation.
    
    Foo<long> f3;   // There is no explicit instantiation or explicit specialization
                    // Code needs to be created for Foo<long>
    

    第三种情况 Foo<long> f3; 触发模板特化 Foo<long> 的创建 . 我将短语_2449710解释为“从类模板中创建 Foo<long> ” .

相关问题