Files
2025-10-25 03:02:53 +03:00

6.8 KiB
Raw Permalink Blame History

[temp.spec.general]

13 Templates [temp]

13.9 Template instantiation and specialization [temp.spec]

13.9.1 General [temp.spec.general]

1

#

The act of instantiating a function, a variable, a class, a member of a class template, or a member template is referred to astemplate instantiation.

2

#

A function instantiated from a function template is called an instantiated function.

A class instantiated from a class template is called an instantiated class.

A member function, a member class, a member enumeration, or a static data member of a class template instantiated from the member definition of the class template is called, respectively, an instantiated member function, member class, member enumeration, or static data member.

A member function instantiated from a member function template is called an instantiated member function.

A member class instantiated from a member class template is called an instantiated member class.

A variable instantiated from a variable template is called an instantiated variable.

A static data member instantiated from a static data member template is called an instantiated static data member.

3

#

An explicit specialization may be declared for a function template, a variable template, a class template, a member of a class template, or a member template.

An explicit specialization declaration is introduced bytemplate<>.

In an explicit specialization declaration for a variable template, a class template, a member of a class template, or a class member template, the variable or class that is explicitly specialized shall be specified with a simple-template-id.

In the explicit specialization declaration for a function template or a member function template, the function or member function explicitly specialized may be specified using a template-id.

[Example 1: template struct A {static int x;};template void g(U) { }template<> struct A { }; // specialize for T == doubletemplate<> struct A<> { }; // specialize for T == inttemplate<> void g(char) { } // specialize for U == char// U is deduced from the parameter typetemplate<> void g(int) { } // specialize for U == inttemplate<> int A::x = 0; // specialize for T == chartemplate struct B {static int x;};template<> int B<>::x = 1; // specialize for T == int — end example]

4

#

An instantiated template specialization can be either implicitly instantiated ([temp.inst]) for a given argument list or be explicitly instantiated ([temp.explicit]).

A specialization is a class, variable, function, or class member that is either instantiated ([temp.inst]) from a templated entity or is an explicit specialization ([temp.expl.spec]) of a templated entity.

5

#

For a given template and a given set oftemplate-arguments,

an explicit instantiation definition shall appear at most once in a program,

an explicit specialization shall be defined at most once in a program, as specified in [basic.def.odr], and

both an explicit instantiation and a declaration of an explicit specialization shall not appear in a program unless the explicit specialization is reachable from the explicit instantiation.

An implementation is not required to diagnose a violation of this rule if neither declaration is reachable from the other.

6

#

The usual access checking rules do not apply to names in a declaration of an explicit instantiation or explicit specialization, with the exception of names appearing in a function body, default argument, base-clause, member-specification, enumerator-list, or static data member or variable template initializer.

[Note 1:

In particular, the template arguments and names used in the function declarator (including parameter types, return types and exception specifications) can be private types or objects that would normally not be accessible.

— end note]

7

#

Each class template specialization instantiated from a template has its own copy of any static members.

[Example 2: template class X {static T s;};template T X::s = 0; X aa; X<char*> bb;

X has a static members of typeint andX<char*> has a static members of typechar*.

— end example]

8

#

If a function declaration acquired its function type through a dependent type without using the syntactic form of a function declarator, the program is ill-formed.

[Example 3: template struct A {static T t;};typedef int function(); A a; // error: would declare A::t as a static member function — end example]