General topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
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 moretemplate parameters, of three kinds: type template parameters, constant template parameters, and template template parameters.
When template arguments are provided, or, forfunction andclass(since C++17) templates only, deduced, they are substituted for the template parameters to obtain aspecialization 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 isinstantiated (the code for it is actually compiled), unless the template was already explicitly specialized or explicitly instantiated. Instantiation of a class template does not 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).
Contents |
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 thetemplate parameters, each of which is eitherconstant parameter, atype parameter, atemplate parameter, or aparameter pack of any of those(since C++11). |
requires-clause | - | (since C++20) arequires-clause that specifies theconstraints on the template arguments. |
declaration | - | declaration of aclass (including struct and union), amember class or member enumeration type, afunction ormember function, a static data member at namespace scope, a variable or static data member at class scope(since C++14), or analias template(since C++11). It may also define atemplate specialization. |
concept-name constraint-expression | - | seeconstraints and concepts |
export was an optional modifier which declared the template asexported (when used with a class template, it declared all of its members exported as well). Files that instantiated exported templates did not need to include their definitions: the declaration was sufficient. Implementations ofexport were rare and disagreed with each other on details. | (until C++11) |
This section is incomplete Reason: core syntax, template parameters, and instantiations, take content common between class_template and function_template |
A template identifier has one of the following syntaxes:
template-name < template-argument-list (optional)> | (1) | ||||||||
operator op < template-argument-list (optional)> | (2) | ||||||||
operator "" identifier< template-argument-list (optional)> | (3) | (since C++11) (deprecated) | |||||||
operator user-defined-string-literal< template-argument-list (optional)> | (4) | (since C++11) | |||||||
template-name | - | anidentifier that names a template |
op | - | anoverloadable operator |
identifier | - | an identifier |
user-defined-string-literal | - | "" followed by an identifier |
A simple template identifier that names a class template specialization names a class.
A template identifier that names an alias template specialization names a type.
A template identifier that names a function template specialization names a function.
If all following conditions are satisfied, a template identifier isvalid :
| (since C++20) |
An invalid simple template id is a compile-time error, unless it names a function template specialization (in which caseSFINAE 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 argumentsusing T2= X<>;// error: no default argument for first template parameterusing T3= X<1>;// error: value 1 does not match type-parameterusing T4= X<int>;// error: substitution failure for second template parameterusing T5= X<S>;// OK
When thetemplate-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 satisfiedPtr<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{}; templatestruct S<char[2]>;// error: constraints not satisfiedtemplate<>struct S<char[2]>{};// error: constraints not satisfied | (since C++20) |
If all following conditions are satisfied, two template identifiers aresame :
Two template identifier that are the same refer to the same variable,(since C++14) class, or function.
Atemplated entity (or, in some sources, "temploid") is any entity that is defined (or, for alambda 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 functionA::f
is not a function template, but is still considered to be templated.
Atemplated function is a function template or a function that is templated.
Atemplated class is a class template or a class that is templated.
Atemplated 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 identifier is valid were not provided | provided |
CWG 2682 | C++98 C++14 | the definitions of templated function/template class (C++98)/templated variable (C++14) were missing | added |
P2308R1 | C++98 | two template identifiers were different if their corresponding constant template arguments are not template-argument-equivalent | they are different if their corresponding constant template parameter values are not template-argument-equivalent |
C documentation forGeneric selection |