A template is a C++ entity that defines one of the following:
| (since C++11) |
| (since C++14) |
| (since C++20) |
Templates are parameterized by one or more template parameters, of three kinds: type template parameters, non-type template parameters, and template template parameters.
When template arguments are provided, or, for function and class (since C++17) templates only, deduced, they are substituted for the template parameters to obtain a specialization of the template, that is, a specific type or a specific function lvalue. Specializations may also be provided explicitly: full specializations are allowed for class, variable (since C++14) and function templates, partial specializations are only allowed for class templates and variable templates (since C++14).
When a class template specialization is referenced in context that requires a complete object type, or when a function template specialization is referenced in context that requires a function definition to exist, the template is instantiated (the code for it is actually compiled), unless the template was already explicitly specialized or explicitly instantiated. Instantiation of a class template doesn't instantiate any of its member functions unless they are also used. At link time, identical instantiations generated by different translation units are merged.
The definition of a class template must be visible at the point of implicit instantiation, which is why template libraries typically provide all template definitions in the headers (e.g. most boost libraries are header-only).
template < parameter-list > requires-clause (optional) declaration | (1) | |
export template < parameter-list > declaration | (2) | (until C++11) |
template < parameter-list > concept concept-name = constraint-expression ; | (3) | (since C++20) |
parameter-list | - | a non-empty comma-separated list of the template parameters, each of which is either non-type parameter, a type parameter, a template parameter, or a parameter pack of any of those. |
requires-clause | - | (since C++20) a requires-clause that specifies the constraints on the template arguments. |
declaration | - | declaration of a class (including struct and union), a member class or member enumeration type, a function or member function, a static data member at namespace scope, a variable or static data member at class scope, (since C++14) or an alias template (since C++11) It may also define a template specialization. |
concept-name constraint-expression | - | see constraints and concepts |
| (until C++11) |
template-name < parameter-list > |
template-name | - | either an identifier that names a template (in which case this is called "simple-template-id ") or a name of an overloaded operator template or user-defined literal template. |
A simple-template-id that names a class template specialization names a class.
A template-id that names an alias template specialization names a type.
A template-id that names a function template specialization names a function.
A template-id is only valid if.
| (since C++20) |
An invalid simple-template-id is a compile-time error, unless it names a function template specialization (in which case SFINAE may apply).
template<class T, T::type n = 0> class X; struct S { using type = int; }; using T1 = X<S, int, int>; // error: too many arguments using T2 = X<>; // error: no default argument for first template parameter using T3 = X<1>; // error: value 1 does not match type-parameter using T4 = X<int>; // error: substitution failure for second template parameter using T5 = X<S>; // OK
When the template-name of a simple-template-id names a constrained non-function template or a constrained template template-parameter, but not a member template that is a member of an unknown specialization, and all template-arguments in the simple-template-id are non-dependent, the associated constraints of the constrained template must be satisfied: template<typename T> concept C1 = sizeof(T) != sizeof(int); template<C1 T> struct S1 {}; template<C1 T> using Ptr = T*; S1<int>* p; // error: constraints not satisfied Ptr<int> p; // error: constraints not satisfied template<typename T> struct S2 { Ptr<int> x; }; // error, no diagnostic required template<typename T> struct S3 { Ptr<T> x; }; // OK, satisfaction is not required S3<int> x; // error: constraints not satisfied template<template<C1 T> class X> struct S4 { X<int> x; // error, no diagnostic required }; template<typename T> concept C2 = sizeof(T) == 1; template<C2 T> struct S {}; template struct S<char[2]>; // error: constraints not satisfied template<> struct S<char[2]> {}; // error: constraints not satisfied | (since C++20) |
Two template-id s are same if.
Two template-id s that are the same refer to the same variable, (since C++14) class, or function.
A templated entity (or, in some sources, "temploid") is any entity that is defined (or, for a lambda expression, created) (since C++11) within a template definition. All of the following are templated entities:
| (since C++20) |
| (since C++11) |
For example, in.
template<typename T> struct A { void f() {} };
the function A::f
is not a function template, but is still considered to be templated.
A templated function is a function template or a function that is templated.
A templated class is a class template or a class that is templated.
A templated variable is a variable template or a variable that is templated. | (since C++14) |
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 2293 | C++98 | the rules of determining whether a template-id is valid were not provided | provided |
CWG 2682 | C++98 C++14 | the definitions of templated function/templated class (C++98)/ templated variable (C++14) were missing | added |
C documentation for Generic selection |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/templates