172 lines
5.8 KiB
Markdown
172 lines
5.8 KiB
Markdown
[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)
|