libstdc++
enable_special_members.h
Go to the documentation of this file.
1// <bits/enable_special_members.h> -*- C++ -*-
2
3// Copyright (C) 2013-2025 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/enable_special_members.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly.
28 */
29
30#ifndef _ENABLE_SPECIAL_MEMBERS_H
31#define _ENABLE_SPECIAL_MEMBERS_H 1
32
33#ifdef _GLIBCXX_SYSHDR
34#pragma GCC system_header
35#endif
36
37#include <bits/c++config.h>
38
39namespace std _GLIBCXX_VISIBILITY(default)
40{
41_GLIBCXX_BEGIN_NAMESPACE_VERSION
42/// @cond undocumented
43
44 struct _Enable_default_constructor_tag
45 {
46 explicit constexpr _Enable_default_constructor_tag() = default;
47 };
48
49/**
50 * @brief A mixin helper to conditionally enable or disable the default
51 * constructor.
52 * @sa _Enable_special_members
53 */
54template<bool _Switch, typename _Tag = void>
55 struct _Enable_default_constructor
56 {
57 constexpr _Enable_default_constructor() noexcept = default;
58 constexpr _Enable_default_constructor(_Enable_default_constructor const&)
59 noexcept = default;
60 constexpr _Enable_default_constructor(_Enable_default_constructor&&)
61 noexcept = default;
62 _Enable_default_constructor&
63 operator=(_Enable_default_constructor const&) noexcept = default;
64 _Enable_default_constructor&
65 operator=(_Enable_default_constructor&&) noexcept = default;
66
67 // Can be used in other ctors.
68 constexpr explicit
69 _Enable_default_constructor(_Enable_default_constructor_tag) { }
70 };
71
72
73/**
74 * @brief A mixin helper to conditionally enable or disable the default
75 * destructor.
76 * @sa _Enable_special_members
77 */
78template<bool _Switch, typename _Tag = void>
79 struct _Enable_destructor { };
80
81/**
82 * @brief A mixin helper to conditionally enable or disable the copy/move
83 * special members.
84 * @sa _Enable_special_members
85 */
86template<bool _Copy, bool _CopyAssignment,
87 bool _Move, bool _MoveAssignment,
88 typename _Tag = void>
89 struct _Enable_copy_move { };
90
91/**
92 * @brief A mixin helper to conditionally enable or disable the special
93 * members.
94 *
95 * The @c _Tag type parameter is to make mixin bases unique and thus avoid
96 * ambiguities.
97 */
98template<bool _Default, bool _Destructor,
99 bool _Copy, bool _CopyAssignment,
100 bool _Move, bool _MoveAssignment,
101 typename _Tag = void>
102 struct _Enable_special_members
103 : private _Enable_default_constructor<_Default, _Tag>,
104 private _Enable_destructor<_Destructor, _Tag>,
105 private _Enable_copy_move<_Copy, _CopyAssignment,
106 _Move, _MoveAssignment,
107 _Tag>
108 { };
109
110// Boilerplate follows.
111
112template<typename _Tag>
113 struct _Enable_default_constructor<false, _Tag>
114 {
115 constexpr _Enable_default_constructor() noexcept = delete;
116 constexpr _Enable_default_constructor(_Enable_default_constructor const&)
117 noexcept = default;
118 constexpr _Enable_default_constructor(_Enable_default_constructor&&)
119 noexcept = default;
120 _Enable_default_constructor&
121 operator=(_Enable_default_constructor const&) noexcept = default;
122 _Enable_default_constructor&
123 operator=(_Enable_default_constructor&&) noexcept = default;
124
125 // Can be used in other ctors.
126 constexpr explicit
127 _Enable_default_constructor(_Enable_default_constructor_tag) { }
128 };
129
130template<typename _Tag>
131 struct _Enable_destructor<false, _Tag>
132 { ~_Enable_destructor() noexcept = delete; };
133
134template<typename _Tag>
135 struct _Enable_copy_move<false, true, true, true, _Tag>
136 {
137 constexpr _Enable_copy_move() noexcept = default;
138 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
139 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
140 _Enable_copy_move&
141 operator=(_Enable_copy_move const&) noexcept = default;
142 _Enable_copy_move&
143 operator=(_Enable_copy_move&&) noexcept = default;
144 };
145
146template<typename _Tag>
147 struct _Enable_copy_move<true, false, true, true, _Tag>
148 {
149 constexpr _Enable_copy_move() noexcept = default;
150 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
151 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
152 _Enable_copy_move&
153 operator=(_Enable_copy_move const&) noexcept = delete;
154 _Enable_copy_move&
155 operator=(_Enable_copy_move&&) noexcept = default;
156 };
157
158template<typename _Tag>
159 struct _Enable_copy_move<false, false, true, true, _Tag>
160 {
161 constexpr _Enable_copy_move() noexcept = default;
162 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
163 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
164 _Enable_copy_move&
165 operator=(_Enable_copy_move const&) noexcept = delete;
166 _Enable_copy_move&
167 operator=(_Enable_copy_move&&) noexcept = default;
168 };
169
170template<typename _Tag>
171 struct _Enable_copy_move<true, true, false, true, _Tag>
172 {
173 constexpr _Enable_copy_move() noexcept = default;
174 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
175 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
176 _Enable_copy_move&
177 operator=(_Enable_copy_move const&) noexcept = default;
178 _Enable_copy_move&
179 operator=(_Enable_copy_move&&) noexcept = default;
180 };
181
182template<typename _Tag>
183 struct _Enable_copy_move<false, true, false, true, _Tag>
184 {
185 constexpr _Enable_copy_move() noexcept = default;
186 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
187 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
188 _Enable_copy_move&
189 operator=(_Enable_copy_move const&) noexcept = default;
190 _Enable_copy_move&
191 operator=(_Enable_copy_move&&) noexcept = default;
192 };
193
194template<typename _Tag>
195 struct _Enable_copy_move<true, false, false, true, _Tag>
196 {
197 constexpr _Enable_copy_move() noexcept = default;
198 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
199 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
200 _Enable_copy_move&
201 operator=(_Enable_copy_move const&) noexcept = delete;
202 _Enable_copy_move&
203 operator=(_Enable_copy_move&&) noexcept = default;
204 };
205
206template<typename _Tag>
207 struct _Enable_copy_move<false, false, false, true, _Tag>
208 {
209 constexpr _Enable_copy_move() noexcept = default;
210 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
211 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
212 _Enable_copy_move&
213 operator=(_Enable_copy_move const&) noexcept = delete;
214 _Enable_copy_move&
215 operator=(_Enable_copy_move&&) noexcept = default;
216 };
217
218template<typename _Tag>
219 struct _Enable_copy_move<true, true, true, false, _Tag>
220 {
221 constexpr _Enable_copy_move() noexcept = default;
222 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
223 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
224 _Enable_copy_move&
225 operator=(_Enable_copy_move const&) noexcept = default;
226 _Enable_copy_move&
227 operator=(_Enable_copy_move&&) noexcept = delete;
228 };
229
230template<typename _Tag>
231 struct _Enable_copy_move<false, true, true, false, _Tag>
232 {
233 constexpr _Enable_copy_move() noexcept = default;
234 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
235 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
236 _Enable_copy_move&
237 operator=(_Enable_copy_move const&) noexcept = default;
238 _Enable_copy_move&
239 operator=(_Enable_copy_move&&) noexcept = delete;
240 };
241
242template<typename _Tag>
243 struct _Enable_copy_move<true, false, true, false, _Tag>
244 {
245 constexpr _Enable_copy_move() noexcept = default;
246 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
247 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
248 _Enable_copy_move&
249 operator=(_Enable_copy_move const&) noexcept = delete;
250 _Enable_copy_move&
251 operator=(_Enable_copy_move&&) noexcept = delete;
252 };
253
254template<typename _Tag>
255 struct _Enable_copy_move<false, false, true, false, _Tag>
256 {
257 constexpr _Enable_copy_move() noexcept = default;
258 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
259 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = default;
260 _Enable_copy_move&
261 operator=(_Enable_copy_move const&) noexcept = delete;
262 _Enable_copy_move&
263 operator=(_Enable_copy_move&&) noexcept = delete;
264 };
265
266template<typename _Tag>
267 struct _Enable_copy_move<true, true, false, false, _Tag>
268 {
269 constexpr _Enable_copy_move() noexcept = default;
270 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
271 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
272 _Enable_copy_move&
273 operator=(_Enable_copy_move const&) noexcept = default;
274 _Enable_copy_move&
275 operator=(_Enable_copy_move&&) noexcept = delete;
276 };
277
278template<typename _Tag>
279 struct _Enable_copy_move<false, true, false, false, _Tag>
280 {
281 constexpr _Enable_copy_move() noexcept = default;
282 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
283 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
284 _Enable_copy_move&
285 operator=(_Enable_copy_move const&) noexcept = default;
286 _Enable_copy_move&
287 operator=(_Enable_copy_move&&) noexcept = delete;
288 };
289
290template<typename _Tag>
291 struct _Enable_copy_move<true, false, false, false, _Tag>
292 {
293 constexpr _Enable_copy_move() noexcept = default;
294 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = default;
295 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
296 _Enable_copy_move&
297 operator=(_Enable_copy_move const&) noexcept = delete;
298 _Enable_copy_move&
299 operator=(_Enable_copy_move&&) noexcept = delete;
300 };
301
302template<typename _Tag>
303 struct _Enable_copy_move<false, false, false, false, _Tag>
304 {
305 constexpr _Enable_copy_move() noexcept = default;
306 constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;
307 constexpr _Enable_copy_move(_Enable_copy_move&&) noexcept = delete;
308 _Enable_copy_move&
309 operator=(_Enable_copy_move const&) noexcept = delete;
310 _Enable_copy_move&
311 operator=(_Enable_copy_move&&) noexcept = delete;
312 };
313
314/// @endcond
315_GLIBCXX_END_NAMESPACE_VERSION
316} // namespace std
317
318#endif // _ENABLE_SPECIAL_MEMBERS_H
ISO C++ entities toplevel namespace is std.