@@ -28,96 +28,106 @@ template <typename T, std::size_t Size> struct array {
2828
2929 // TODO: constructors
3030 template <typename ... Us>
31- constexpr array (Us... values) : storage({values...}) {}
31+ constexpr explicit array (Us... values) : storage({values...}) {}
3232
33- [[nodiscard]] constexpr reference
34- operator [](var<size_type, ival<0 , Size - 1 >> pos) {
33+ [[nodiscard]] constexpr auto
34+ operator [](var<size_type, ival<0 , Size - 1 >> pos) -> reference {
3535 return storage[pos.unsafe_value ()];
3636 }
3737
38- [[nodiscard]] constexpr const_reference
39- operator [](var<size_type, ival<0 , Size - 1 >> pos) const {
38+ [[nodiscard]] constexpr auto
39+ operator [](var<size_type, ival<0 , Size - 1 >> pos) const -> const_reference {
4040 return storage[pos.unsafe_value ()];
4141 }
4242
43- [[nodiscard]] constexpr reference
44- at (var<size_type, ival< 0 , Size - 1 >> pos) {
43+ [[nodiscard]] constexpr auto at (var<size_type, ival< 0 , Size - 1 >> pos)
44+ -> reference {
4545 return storage[pos.unsafe_value ()];
4646 }
4747
48- [[nodiscard]] constexpr const_reference
49- at (var<size_type, ival< 0 , Size - 1 >> pos) const {
48+ [[nodiscard]] constexpr auto at (var<size_type, ival< 0 , Size - 1 >> pos) const
49+ -> const_reference {
5050 return storage[pos.unsafe_value ()];
5151 }
5252
53- [[nodiscard]] constexpr reference front () { return storage.front (); }
53+ [[nodiscard]] constexpr auto front () -> reference {
54+ return storage.front ();
55+ }
5456
55- [[nodiscard]] constexpr const_reference front () const {
57+ [[nodiscard]] constexpr auto front () const -> const_reference {
5658 return storage.front ();
5759 }
5860
59- [[nodiscard]] constexpr reference back () { return storage.back (); }
61+ [[nodiscard]] constexpr auto back () -> reference { return storage.back (); }
6062
61- [[nodiscard]] constexpr const_reference back () const {
63+ [[nodiscard]] constexpr auto back () const -> const_reference {
6264 return storage.back ();
6365 }
6466
6567 // NOTE: intentionally omitting data()
6668
67- [[nodiscard]] constexpr iterator begin () { return storage.begin (); }
69+ [[nodiscard]] constexpr auto begin () -> iterator { return storage.begin (); }
6870
69- [[nodiscard]] constexpr const_iterator begin () const {
71+ [[nodiscard]] constexpr auto begin () const -> const_iterator {
7072 return storage.begin ();
7173 }
7274
73- [[nodiscard]] constexpr const_iterator cbegin () const {
75+ [[nodiscard]] constexpr auto cbegin () const -> const_iterator {
7476 return storage.cbegin ();
7577 }
7678
77- [[nodiscard]] constexpr iterator end () { return storage.end (); }
79+ [[nodiscard]] constexpr auto end () -> iterator { return storage.end (); }
7880
79- [[nodiscard]] constexpr const_iterator end () const { return storage.end (); }
81+ [[nodiscard]] constexpr auto end () const -> const_iterator {
82+ return storage.end ();
83+ }
8084
81- [[nodiscard]] constexpr const_iterator cend () const {
85+ [[nodiscard]] constexpr auto cend () const -> const_iterator {
8286 return storage.cend ();
8387 }
8488
85- [[nodiscard]] constexpr reverse_iterator rbegin () {
89+ [[nodiscard]] constexpr auto rbegin () -> reverse_iterator {
8690 return storage.rbegin ();
8791 }
8892
89- [[nodiscard]] constexpr const_reverse_iterator rbegin () const {
93+ [[nodiscard]] constexpr auto rbegin () const -> const_reverse_iterator {
9094 return storage.rbegin ();
9195 }
9296
93- [[nodiscard]] constexpr const_reverse_iterator crbegin () const {
97+ [[nodiscard]] constexpr auto crbegin () const -> const_reverse_iterator {
9498 return storage.crbegin ();
9599 }
96100
97- [[nodiscard]] constexpr reverse_iterator rend () { return storage.rend (); }
101+ [[nodiscard]] constexpr auto rend () -> reverse_iterator {
102+ return storage.rend ();
103+ }
98104
99- [[nodiscard]] constexpr const_reverse_iterator rend () const {
105+ [[nodiscard]] constexpr auto rend () const -> const_reverse_iterator {
100106 return storage.rend ();
101107 }
102108
103- [[nodiscard]] constexpr const_reverse_iterator crend () const {
109+ [[nodiscard]] constexpr auto crend () const -> const_reverse_iterator {
104110 return storage.crend ();
105111 }
106112
107- [[nodiscard]] constexpr bool empty () const { return storage.empty (); }
113+ [[nodiscard]] constexpr auto empty () const -> bool {
114+ return storage.empty ();
115+ }
108116
109- [[nodiscard]] constexpr size_type size () const { return storage.size (); }
117+ [[nodiscard]] constexpr auto size () const -> size_type {
118+ return storage.size ();
119+ }
110120
111- [[nodiscard]] constexpr size_type max_size () const {
121+ [[nodiscard]] constexpr auto max_size () const -> size_type {
112122 return storage.max_size ();
113123 }
114124
115125 constexpr void fill (T const &value) { storage.fill (value); }
116126
117127 constexpr void swap (array &other) { storage.swap (other.storage ); }
118128
119- [[nodiscard]] friend constexpr bool operator ==(array const &lhs,
120- array const &rhs) {
129+ [[nodiscard]] friend constexpr auto operator ==(array const &lhs,
130+ array const &rhs) -> bool {
121131 return lhs.storage == rhs.storage ;
122132 }
123133
@@ -132,22 +142,24 @@ template <class T, class... U> array(T, U...) -> array<T, 1 + sizeof...(U)>;
132142
133143namespace std {
134144template <std::size_t I, class T , std::size_t N>
135- [[nodiscard]] constexpr T & get (safe::array<T, N> &a) noexcept {
145+ [[nodiscard]] constexpr auto get (safe::array<T, N> &a) noexcept -> T & {
136146 return a[safe::constant<std::size_t , I>];
137147}
138148
139149template <std::size_t I, class T , std::size_t N>
140- [[nodiscard]] constexpr T && get(safe::array<T, N> &&a) noexcept {
141- return a [safe::constant<std::size_t , I>];
150+ [[nodiscard]] constexpr auto get (safe::array<T, N> &&a) noexcept -> T && {
151+ return std::move (a) [safe::constant<std::size_t , I>];
142152}
143153
144154template <std::size_t I, class T , std::size_t N>
145- [[nodiscard]] constexpr T const &get (safe::array<T, N> const &a) noexcept {
155+ [[nodiscard]] constexpr auto get (safe::array<T, N> const &a) noexcept
156+ -> T const & {
146157 return a[safe::constant<std::size_t , I>];
147158}
148159
149160template <std::size_t I, class T , std::size_t N>
150- [[nodiscard]] constexpr T const &&get(safe::array<T, N> const &&a) noexcept {
161+ [[nodiscard]] constexpr auto get (safe::array<T, N> const &&a) noexcept
162+ -> T const && {
151163 return a[safe::constant<std::size_t , I>];
152164}
153165
@@ -164,4 +176,4 @@ template <std::size_t I, class T, std::size_t N>
164176struct tuple_element <I, safe::array<T, N>> {
165177 using type = T;
166178};
167- } // namespace std
179+ } // namespace std
0 commit comments