Unless otherwise specified,
the behavior of a C++ program is undefined if it adds declarations or definitions to namespace
std
or to a namespace within namespace
std.
Unless explicitly prohibited,
a program may add a template specialization for
any standard library class template
to namespace
std provided that
(a) the added declaration
depends on at least one program-defined type
and
(b) the specialization meets the standard library requirements
for the original template.172
The behavior of a C++ program is undefined
if it declares an explicit or partial specialization
of any standard library variable template,
except where explicitly permitted by the specification of that variable template.
A program may explicitly instantiate
a class template defined in the standard library
only if the declaration
(a) depends on the name of at least one program-defined type
and
(b) the instantiation meets the standard library requirements for the
original template.
Let F denote
a standard library function ([global.functions]),
a standard library static member function,
or an instantiation
of a standard library function template.
Unless F is designated
an addressable function,
the behavior of a C++ program is unspecified (possibly ill-formed)
if it explicitly or implicitly attempts
to form a pointer
to F.
Moreover,
the behavior of a C++ program is unspecified (possibly ill-formed)
if it attempts to form a reference
to F
or
if it attempts to form a pointer-to-member designating
either a standard library non-static member function ([member.functions])
or an instantiation of a standard library member function template.
Other than in namespace std
or in a namespace
within namespace std,
a program may provide
an overload for any library function template
designated as a customization point,
provided that
(a)
the overload's declaration depends
on at least one user-defined type
and
(b)
the overload meets the standard library requirements
for the customization point.173
Any
library code that instantiates other library templates
must be prepared to work adequately with any user-supplied specialization
that meets the minimum requirements of this document.
Any library customization point
must be prepared
to work adequately
with any user-defined overload
that meets the minimum requirements
of this document.
Therefore
an implementation may elect,
under the as-if rule ([intro.execution]),
to provide any customization point
in the form
of an instantiated function object ([function.objects])
even though the customization point's specification
is in the form
of a function template.
The template parameters
of each such function object
and the function parameters
and return type
of the object's operator()
must match those
of the corresponding customization point's specification.