This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

40
cppdraft/out/of/range.md Normal file
View File

@@ -0,0 +1,40 @@
[out.of.range]
# 19 Diagnostics library [[diagnostics]](./#diagnostics)
## 19.2 Exception classes [[std.exceptions]](std.exceptions#out.of.range)
### 19.2.7 Class out_of_range [out.of.range]
[🔗](#lib:out_of_range)
namespace std {class out_of_range : public logic_error {public:constexpr explicit out_of_range(const string& what_arg); constexpr explicit out_of_range(const char* what_arg); };}
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L257)
The classout_of_range defines the type of objects thrown as exceptions to report an
argument value not in its expected range[.](#1.sentence-1)
[🔗](#lib:out_of_range,constructor)
`constexpr out_of_range(const string& what_arg);
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L270)
*Postconditions*: strcmp(what(), what_arg.c_str()) == 0[.](#2.sentence-1)
[🔗](#lib:out_of_range,constructor_)
`constexpr out_of_range(const char* what_arg);
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L281)
*Postconditions*: strcmp(what(), what_arg) == 0[.](#3.sentence-1)

28
cppdraft/out/ptr.md Normal file
View File

@@ -0,0 +1,28 @@
[out.ptr]
# 20 Memory management library [[mem]](./#mem)
## 20.3 Smart pointers [[smartptr]](smartptr#out.ptr)
### 20.3.4 Smart pointer adaptors [[smartptr.adapt]](smartptr.adapt#out.ptr)
#### 20.3.4.2 Function template out_ptr [out.ptr]
[🔗](#lib:out_ptr)
`template<class Pointer = void, class Smart, class... Args>
constexpr auto out_ptr(Smart& s, Args&&... args);
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5650)
Let P be Pointer if is_void_v<Pointer> is false,
otherwise *POINTER_OF*(Smart)[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5655)
*Returns*: out_ptr_t<Smart, P, Args&&...>(s, std::forward<Args>(args)...)[.](#2.sentence-1)

213
cppdraft/out/ptr/t.md Normal file
View File

@@ -0,0 +1,213 @@
[out.ptr.t]
# 20 Memory management library [[mem]](./#mem)
## 20.3 Smart pointers [[smartptr]](smartptr#out.ptr.t)
### 20.3.4 Smart pointer adaptors [[smartptr.adapt]](smartptr.adapt#out.ptr.t)
#### 20.3.4.1 Class template out_ptr_t [out.ptr.t]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5423)
out_ptr_t is a class template used to adapt types
such as smart pointers ([[smartptr]](smartptr "20.3Smart pointers"))
for functions that use output pointer parameters[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5428)
[*Example [1](#example-1)*:
#include <memory>#include <cstdio>int fopen_s(std::FILE** f, const char* name, const char* mode);
struct fclose_deleter {void operator()(std::FILE* f) const noexcept { std::fclose(f); }};
int main(int, char*[]) {constexpr const char* file_name = "ow.o";
std::unique_ptr<std::FILE, fclose_deleter> file_ptr; int err = fopen_s(std::out_ptr<std::FILE*>(file_ptr), file_name, "r+b"); if (err != 0)return 1; // *file_ptr is validreturn 0;}unique_ptr can be used with out_ptr to be passed into an output pointer-style function,
without needing to hold onto an intermediate pointer value and
manually delete it on error or failure[.](#2.sentence-1)
— *end example*]
[🔗](#lib:out_ptr_t)
namespace std {template<class Smart, class Pointer, class... Args>class out_ptr_t {public:constexpr explicit out_ptr_t(Smart&, Args...);
out_ptr_t(const out_ptr_t&) = delete; constexpr ~out_ptr_t(); constexpr operator Pointer*() const noexcept; operator void**() const noexcept; private: Smart& s; // *exposition only* tuple<Args...> a; // *exposition only* Pointer p; // *exposition only*};}
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5480)
Pointer shall meet the [*Cpp17NullablePointer*](nullablepointer.requirements#:Cpp17NullablePointer "16.4.4.4Cpp17NullablePointer requirements[nullablepointer.requirements]") requirements[.](#3.sentence-1)
If Smart is a specialization of shared_ptr andsizeof...(Args) == 0,
the program is ill-formed[.](#3.sentence-2)
[*Note [1](#note-1)*:
It is typically a user error to reset a shared_ptr without specifying a deleter,
as shared_ptr will replace a custom deleter upon usage of reset,
as specified in [[util.smartptr.shared.mod]](util.smartptr.shared.mod "20.3.2.2.5Modifiers")[.](#3.sentence-3)
— *end note*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5492)
Program-defined specializations of out_ptr_t that depend on at least one program-defined type
need not meet the requirements for the primary template[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5497)
Evaluations of the conversion functions
on the same object may conflict ([[intro.races]](intro.races "6.10.2.2Data races"))[.](#5.sentence-1)
[🔗](#lib:out_ptr_t,constructor)
`constexpr explicit out_ptr_t(Smart& smart, Args... args);
`
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5507)
*Effects*: Initializes s with smart,a with std::forward<Args>(args)..., and
value-initializes p[.](#6.sentence-1)
Then, equivalent to:
- [(6.1)](#6.1)
s.reset(); if the expression s.reset() is well-formed;
- [(6.2)](#6.2)
otherwise,s = Smart(); if is_constructible_v<Smart> is true;
- [(6.3)](#6.3)
otherwise, the program is ill-formed[.](#6.sentence-2)
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5533)
[*Note [2](#note-2)*:
The constructor is not noexcept to allow for a variety of non-terminating and safe implementation strategies[.](#7.sentence-1)
For example, an implementation can allocate
a shared_ptr's internal node in the constructor and
let implementation-defined exceptions escape safely[.](#7.sentence-2)
The destructor can then move the allocated control block in directly and
avoid any other exceptions[.](#7.sentence-3)
— *end note*]
[🔗](#lib:out_ptr_t,destructor)
`constexpr ~out_ptr_t();
`
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5551)
Let SP be*POINTER_OF_OR*(Smart, Pointer) ([[memory.general]](memory.general "20.2.1General"))[.](#8.sentence-1)
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5555)
*Effects*: Equivalent to:
- [(9.1)](#9.1)
if (p) { apply([&](auto&&... args) { s.reset(static_cast<SP>(p), std::forward<Args>(args)...); }, std::move(a));} if the expressions.reset(static_cast<SP>(p), std::forward<Args>(args)...) is well-formed;
- [(9.2)](#9.2)
otherwise,if (p) { apply([&](auto&&... args) { s = Smart(static_cast<SP>(p), std::forward<Args>(args)...); }, std::move(a));} if is_constructible_v<Smart, SP, Args...> is true;
- [(9.3)](#9.3)
otherwise, the program is ill-formed[.](#9.sentence-1)
[🔗](#itemdecl:3)
`constexpr operator Pointer*() const noexcept;
`
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5590)
*Preconditions*: operator void**() has not been called on *this[.](#10.sentence-1)
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5594)
*Returns*: addressof(const_cast<Pointer&>(p))[.](#11.sentence-1)
[🔗](#itemdecl:4)
`operator void**() const noexcept;
`
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5604)
*Constraints*: is_same_v<Pointer, void*> is false[.](#12.sentence-1)
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5608)
*Mandates*: is_pointer_v<Pointer> is true[.](#13.sentence-1)
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5612)
*Preconditions*: operator Pointer*() has not been called on *this[.](#14.sentence-1)
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5616)
*Returns*: A pointer value v such that:
- [(15.1)](#15.1)
the initial value *v is equivalent to static_cast<void*>(p) and
- [(15.2)](#15.2)
any modification of *v that is not followed by a subsequent modification of *this affects the value of p during the destruction of *this,
such that static_cast<void*>(p) == *v[.](#15.sentence-1)
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5629)
*Remarks*: Accessing *v outside the lifetime of *this has undefined behavior[.](#16.sentence-1)
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/memory.tex#L5634)
[*Note [3](#note-3)*:
reinterpret_cast<void**>(static_cast<Pointer*>(*this)) can be a viable implementation strategy for some implementations[.](#17.sentence-1)
— *end note*]