Adding declarations to std
It is undefined behavior to add declarations or definitions to namespace std
or to any namespace nested within std
, with a few exceptions noted below.
#include <utility> namespace std { // a function definition added to namespace std: undefined behavior pair<int, int> operator+(pair<int, int> a, pair<int, int> b) { return {a.first+b.first, a.second+b.second}; } }
It is allowed to add template specializations for any standard library template to the namespace std
only if the declaration depends on a user-defined type and the specialization satisfies all requirements for the original template, except where such specializations are prohibited.
- It is undefined behavior to declare a full specialization of any member function of a standard library class template
- It is undefined behavior to declare a full specialization of any member function template of a standard library class or class template
- It is undefined behavior to declare a full or partial specialization of any member class template of a standard library class or class template.
- None of the type traits defined in
<type_traits>
may be specialized for a user-defined type, except forstd::common_type
. - Specializing the template
std::complex
for any type other than float, double, and long double is unspecified. - Specializations of
std::hash
for user-defined types must satisfyHash
requirements. - Specializations of
std::atomic
must have a deleted copy constructor, a deleted copy assignment operator, and a constexpr value constructor. - Specializations of
std::shared_ptr
andstd::weak_ptr
must beCopyConstructible
andCopyAssignable
. In addition, specializations ofstd::shared_ptr
must beLessThanComparable
, and convertible tobool
. - Specializations of
std::istreambuf_iterator
must have a trivial copy constructor, a constexpr default constructor, and a trivial destructor. - Specializations of
std::numeric_limits
must define all members declaredstatic constexpr
in the primary template, in such a way that they are usable as integral constant expressions. -
std::unary_function
andstd::binary_function
may not be specialized.
It is allowed to explicitly instantiate a template defined in the standard library only if the declaration depends on the name of a user-defined type and the instantiation meets the standard library requirements for the original template.
Other restrictions
The namespace std
may not be declared as an inline
namespace.
Please login to continue.