[namespace.std] # 16 Library introduction [[library]](./#library) ## 16.4 Library-wide requirements [[requirements]](requirements#namespace.std) ### 16.4.5 Constraints on programs [[constraints]](constraints#namespace.std) #### 16.4.5.2 Namespace use [[namespace.constraints]](namespace.constraints#namespace.std) #### 16.4.5.2.1 Namespace std [namespace.std] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2991) Unless otherwise specified, the behavior of a C++ program is undefined if it adds declarations or definitions to namespacestd or to a namespace within namespacestd[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L2998) Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespacestd provided that - [(2.1)](#2.1) the added declaration depends on at least one program-defined type, and - [(2.2)](#2.2) the specialization meets the standard library requirements for the original template[.](#2.sentence-1)[151](#footnote-151 "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.") [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3018) 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[.](#3.sentence-1) [*Note [1](#note-1)*: The requirements on an explicit or partial specialization are stated by each variable template that grants such permission[.](#3.sentence-2) — *end note*] [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3028) The behavior of a C++ program is undefined if it declares - [(4.1)](#4.1) an explicit specialization of any member function of a standard library class template, or - [(4.2)](#4.2) an explicit specialization of any member function template of a standard library class or class template, or - [(4.3)](#4.3) an explicit or partial specialization of any member class template of a standard library class or class template, or - [(4.4)](#4.4) a deduction guide for any standard library class template[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3043) A program may explicitly instantiate a class template defined in the standard library only if the declaration - [(5.1)](#5.1) depends on the name of at least one program-defined type, and - [(5.2)](#5.2) the instantiation meets the standard library requirements for the original template[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3054) Let *F* denote a standard library function ([[global.functions]](global.functions "16.4.6.4 Non-member functions")), a standard library static member function, or an instantiation of a standard library function template[.](#6.sentence-1) Unless *F* is designated an [*addressable function*](#def:function,addressable "16.4.5.2.1 Namespace std [namespace.std]"), the behavior of a C++ program is unspecified (possibly ill-formed) if it explicitly or implicitly attempts to form a pointer to *F*[.](#6.sentence-2) [*Note [2](#note-2)*: Possible means of forming such pointers include application of the unary & operator ([[expr.unary.op]](expr.unary.op "7.6.2.2 Unary operators")),addressof ([[specialized.addressof]](specialized.addressof "20.2.11 addressof")), or a function-to-pointer standard conversion ([[conv.func]](conv.func "7.3.4 Function-to-pointer conversion"))[.](#6.sentence-3) — *end note*] 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]](member.functions "16.4.6.5 Member functions")) or an instantiation of a standard library member function template[.](#6.sentence-4) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3082) Let *F* denote a standard library function or function template[.](#7.sentence-1) Unless *F* is designated an addressable function, it is unspecified if or how a reflection value designating the associated entity can be formed[.](#7.sentence-2) [*Note [3](#note-3)*: For example, it is possible that std​::​meta​::​members_of will not return reflections of standard library functions that an implementation handles through an extra-linguistic mechanism[.](#7.sentence-3) — *end note*] [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3095) Let *C* denote a standard library class or class template specialization[.](#8.sentence-1) It is unspecified if or how a reflection value can be formed to any private member of *C*, or what the names of such members may be[.](#8.sentence-2) [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lib-intro.tex#L3102) A translation unit shall not declare namespace std to be an inline namespace ([[namespace.def]](namespace.def "9.9.2 Namespace definition"))[.](#9.sentence-1) [151)](#footnote-151)[151)](#footnoteref-151) 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[.](#footnote-151.sentence-1)