@@ -15,20 +15,22 @@ It can be thought of like a...
1515* ` std::array ` except the size is specified at runtime.
1616* ` std::vector ` except it can neither shrink nor grow.
1717
18- ### Container Named Requirements
19- In order to allow element access using iterators and to align with various container
20- idioms for ` std:: ` algorithms, ` gsl::dyn_array ` should satisfy the following named
21- requirements:
22-
23- * Container ([ link] ( https://en.cppreference.com/w/cpp/named_req/Container ) )
24- * ReversibleContainer ([ link] ( https://en.cppreference.com/w/cpp/named_req/ReversibleContainer ) )
25- * ContiguousContainer ([ link] ( https://en.cppreference.com/w/cpp/named_req/ContiguousContainer ) )
26- * SequenceContainer ([ link] ( https://en.cppreference.com/w/cpp/named_req/SequenceContainer ) )
27- * AllocatorAwareContainer ([ link] ( https://en.cppreference.com/w/cpp/named_req/AllocatorAwareContainer ) )
18+ By design, ` gsl::dyn_array ` is not a ` Container ` as defined by the C++ Named
19+ Requirements because we want to avoid the invalidation of iterators or references to
20+ ` gsl::dyn_array ` objects.
2821
2922### Construction
30- In addition to the constructors required by the named requirements (default, copy, and
31- move), ` gsl::dyn_array ` will support the following constructors:
23+ ` gsl::dyn_array ` s can be constructed in the following ways:
24+
25+ * Default construct a ` dyn_array ` with no elements:
26+ ``` c++
27+ constexpr dyn_array ();
28+ ```
29+
30+ * Move construct a ` dyn_array ` from ` other ` :
31+ ``` c++
32+ constexpr dyn_array (dyn_array&& other) noexcept;
33+ ```
3234
3335* Construct a `dyn_array` with `n` default constructed elements:
3436```c++
@@ -43,20 +45,24 @@ constexpr dyn_array(size_t n, const T& arg, const Allocator & alloc = Allocator(
4345* Construct a `dyn_array` with elements from the range `[first, last)`:
4446```c++
4547template <typename InputIt>
46- requires (std::input_iterator<InputIt >)
48+ #ifdef __cpp_lib_concepts
49+ requires(std::input_iterator<InputIt>)
50+ #endif /* __cpp_lib_concepts */
4751constexpr dyn_array(InputIt first, InputIt last, const Allocator & alloc = Allocator());
4852```
4953
50- * Construct a `dyn_array` with elements from the initializer list :
54+ * Construct a ` dyn_array ` from a range :
5155``` c++
52- constexpr dyn_array(std::initializer_list<T>, const Allocator & alloc = Allocator());
56+ #ifdef __cpp_lib_containers_range
57+ template <typename R >
58+ requires(std::ranges::range<R >)
59+ constexpr dyn_array(std::from_range_t, R&& r, const Allocator & alloc = Allocator());
60+ #endif /* __cpp_lib_containers_range */
5361```
5462
55- * Construct a ` dyn_array ` with elements from the range ` R ` :
63+ * Construct a ` dyn_array ` with elements from the initializer list :
5664``` c++
57- template <typename R>
58- requires (std::input_range<R >)
59- constexpr dyn_array(R&&, const Allocator & alloc = Allocator());
65+ constexpr dyn_array (std::initializer_list<T >, const Allocator & alloc = Allocator());
6066```
6167
6268### Operations
@@ -66,7 +72,7 @@ support the following operations:
6672* Access the specified element **_with bounds checking_**:
6773```c++
6874constexpr T& operator[](size_t);
69- constexpr const T& operator[](size_t) const
75+ constexpr const T& operator[](size_t) const;
7076```
7177
7278* Access the underlying array:
@@ -80,10 +86,17 @@ constexpr const T* data() const noexcept;
8086constexpr size_t size () const noexcept ;
8187```
8288
83- #### Note: Why no push_back (and friends)?
89+ ### FAQ
90+
91+ #### Why no push_back (and friends)?
8492` gsl::dyn_array ` is intended to be a fixed-size array and all objects should be
85- constructed at creation. Moreover, the memory overhead of storing another member
86- variable to track where to push the next item is not desired.
93+ constructed at creation.
94+
95+ #### Why does ` gsl::dyn_array ` not conform to the ` Container ` Named Requirements?
96+ ` gsl::dyn_array ` is intended to be a safer replacement for raw pointers and sizes. We
97+ don't want users to accidentally use it in a way that would be unsafe. For example,
98+ ` gsl::dyn_array ` does not have copy or move assignment operators. This is because it
99+ would be possible to invalidate existing iterators and references.
87100
88101### Bounds Checking Semantics
89102If an out-of-bounds access (read or write) is attempted, ` gsl::dyn_array ` should follow
0 commit comments