NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
unique_ptr.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_MEMORY_UNIQUE_PTR_HPP__
2#define NEFORCE_CORE_MEMORY_UNIQUE_PTR_HPP__
3
11
16NEFORCE_BEGIN_NAMESPACE__
17
23
25NEFORCE_BEGIN_INNER__
26
35template <typename T, typename Deleter>
36class __unique_ptr_impl {
37private:
38 template <typename U, typename E, typename = void>
39 struct inner_ptr {
40 using type = U*;
41 };
42
43 template <typename U, typename E>
44 struct inner_ptr<U, E, void_t<typename remove_reference_t<E>::pointer>> {
45 using type = typename remove_reference<E>::type::pointer;
46 };
47
48public:
49 using DeleterConstraint = enable_if<is_default_constructible<Deleter>::value>;
50 using pointer = typename inner_ptr<T, Deleter>::type;
51
52private:
53 compressed_pair<Deleter, pointer> ptr_pair_{default_construct_tag{}, nullptr};
54
56 "deleter type of unique_ptr must be a function object type or an lvalue reference type");
57
58public:
59 __unique_ptr_impl() = default;
60
61 NEFORCE_CONSTEXPR20 __unique_ptr_impl(pointer ptr) :
62 ptr_pair_(default_construct_tag{}, ptr) {}
63
64 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
65 NEFORCE_CONSTEXPR20 __unique_ptr_impl(pointer ptr, Del&& deleter) :
66 ptr_pair_(exact_arg_construct_tag{}, _NEFORCE forward<Del>(deleter), ptr) {}
67
68 NEFORCE_CONSTEXPR20 __unique_ptr_impl(__unique_ptr_impl&& other) noexcept :
69 ptr_pair_(_NEFORCE move(other.ptr_pair_)) {
70 other.get_ptr() = nullptr;
71 }
72
73 NEFORCE_CONSTEXPR20 __unique_ptr_impl& operator=(__unique_ptr_impl&& other) noexcept {
74 this->reset(other.release());
75 return *this;
76 }
77
78 NEFORCE_CONSTEXPR20 pointer& get_ptr() noexcept { return ptr_pair_.value; }
79
80 NEFORCE_CONSTEXPR20 pointer get_ptr() const noexcept { return ptr_pair_.value; }
81
82 NEFORCE_CONSTEXPR20 Deleter& get_deleter() & noexcept { return ptr_pair_.get_base(); }
83
84 NEFORCE_CONSTEXPR20 const Deleter& get_deleter() const& noexcept { return ptr_pair_.get_base(); }
85
86 NEFORCE_CONSTEXPR20 Deleter&& get_deleter() && noexcept { return _NEFORCE move(ptr_pair_).get_base(); }
87
88 NEFORCE_CONSTEXPR20 const Deleter&& get_deleter() const&& noexcept { return _NEFORCE move(ptr_pair_).get_base(); }
89
90 NEFORCE_CONSTEXPR20 void reset(pointer ptr) noexcept {
91 const pointer old = get_ptr();
92 get_ptr() = ptr;
93 if (old) {
94 ptr_pair_.get_base()(old);
95 }
96 }
97
98 NEFORCE_CONSTEXPR20 pointer release() noexcept {
99 pointer p = get_ptr();
100 get_ptr() = nullptr;
101 return p;
102 }
103
104 NEFORCE_CONSTEXPR20 void swap(__unique_ptr_impl& other) noexcept { _NEFORCE swap(ptr_pair_, other.ptr_pair_); }
105};
106
117template <typename T, typename Deleter, bool MoveConstructible = is_move_constructible<Deleter>::value,
118 bool MoveAssignable = is_move_assignable<Deleter>::value>
119struct __unique_ptr_data : __unique_ptr_impl<T, Deleter> {
120 using base_type = __unique_ptr_impl<T, Deleter>;
121 using pointer = typename base_type::pointer;
122
123 __unique_ptr_data() = default;
124
125 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
126 base_type(ptr) {}
127
128 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
129 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Del&& deleter) :
130 base_type(ptr, _NEFORCE forward<Del>(deleter)) {}
131
132 __unique_ptr_data(__unique_ptr_data&&) = default;
133 __unique_ptr_data& operator=(__unique_ptr_data&&) = default;
134};
135
136// 删除器可移动构造但不可移动赋值
137template <typename T, typename Deleter>
138struct __unique_ptr_data<T, Deleter, true, false> : __unique_ptr_impl<T, Deleter> {
139 using base_type = __unique_ptr_impl<T, Deleter>;
140 using pointer = typename base_type::pointer;
141
142 __unique_ptr_data() = default;
143
144 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
145 base_type(ptr) {}
146
147 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
148 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Del&& deleter) :
149 base_type(ptr, _NEFORCE forward<Del>(deleter)) {}
150
151 __unique_ptr_data(__unique_ptr_data&&) = default;
152 __unique_ptr_data& operator=(__unique_ptr_data&&) = delete;
153};
154
155// 删除器可移动赋值但不可移动构造
156template <typename T, typename Deleter>
157struct __unique_ptr_data<T, Deleter, false, true> : __unique_ptr_impl<T, Deleter> {
158 using base_type = __unique_ptr_impl<T, Deleter>;
159 using pointer = typename base_type::pointer;
160
161 __unique_ptr_data() = default;
162
163 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
164 base_type(ptr) {}
165
166 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
167 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Del&& deleter) :
168 base_type(ptr, _NEFORCE forward<Del>(deleter)) {}
169
170 __unique_ptr_data(__unique_ptr_data&&) = delete;
171 __unique_ptr_data& operator=(__unique_ptr_data&&) = default;
172};
173
174// 删除器既不可移动构造也不可移动赋值
175template <typename T, typename Deleter>
176struct __unique_ptr_data<T, Deleter, false, false> : __unique_ptr_impl<T, Deleter> {
177 using base_type = __unique_ptr_impl<T, Deleter>;
178 using pointer = typename base_type::pointer;
179
180 __unique_ptr_data() = default;
181
182 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
183 base_type(ptr) {}
184
185 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
186 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Del&& deleter) :
187 base_type(ptr, _NEFORCE forward<Del>(deleter)) {}
188
189 __unique_ptr_data(__unique_ptr_data&&) = delete;
190 __unique_ptr_data& operator=(__unique_ptr_data&&) = delete;
191};
192
193NEFORCE_END_INNER__
195
196
205template <typename T, typename Deleter = default_deleter<T>>
207private:
208 template <typename U>
209 using DeleterConstraint = typename inner::__unique_ptr_impl<T, U>::DeleterConstraint::type;
210
211 inner::__unique_ptr_data<T, Deleter> data_{};
212
213public:
214 using pointer = typename inner::__unique_ptr_impl<T, Deleter>::pointer;
215 using element_type = T;
216 using deleter_type = Deleter;
217
218private:
219 template <typename U, typename E>
222
223public:
228 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
229 constexpr unique_ptr(nullptr_t = nullptr) noexcept {}
230
236 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
237 NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr) noexcept :
238 data_(ptr) {}
239
245 template <typename Del = Deleter, enable_if_t<is_constructible_v<Deleter, Del>, int> = 0>
246 NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr, Del&& deleter) noexcept :
247 data_(ptr, _NEFORCE forward<Del>(deleter)) {}
248
249 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr&&) noexcept = default;
250
257 template <typename U, typename E,
258 enable_if_t<conjunction<safe_conversion<U, E>,
259 conditional_t<is_reference<Deleter>::value, is_same<E, Deleter>,
260 is_convertible<E, Deleter>>>::value,
261 int> = 0>
262 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr<U, E>&& other) noexcept :
263 data_(other.release(), _NEFORCE forward<E>(other.get_deleter())) {}
264
268 ~unique_ptr() noexcept {
269 auto& ptr = data_.get_ptr();
270 if (ptr != nullptr) {
271 get_deleter()(ptr);
272 }
273 ptr = pointer();
274 }
275
276 unique_ptr& operator=(unique_ptr&&) noexcept = default;
277
285 template <typename U, typename E,
286 enable_if_t<conjunction<safe_conversion<U, E>, is_assignable<deleter_type&, E&&>>::value, int> = 0>
287 NEFORCE_CONSTEXPR20 unique_ptr& operator=(unique_ptr<U, E>&& other) noexcept {
288 reset(other.release());
289 get_deleter() = _NEFORCE forward<E>(other.get_deleter());
290 return *this;
291 }
292
297 NEFORCE_CONSTEXPR20 unique_ptr& operator=(nullptr_t) noexcept {
298 reset();
299 return *this;
300 }
301
307 noexcept(noexcept(*_NEFORCE declval<pointer>())) {
308 return *get();
309 }
310
315 NEFORCE_CONSTEXPR20 pointer operator->() const noexcept { return get(); }
316
320 NEFORCE_CONSTEXPR20 pointer get() const noexcept { return data_.get_ptr(); }
321
325 NEFORCE_CONSTEXPR20 deleter_type& get_deleter() & noexcept { return data_.get_deleter(); }
329 NEFORCE_CONSTEXPR20 const deleter_type& get_deleter() const& noexcept { return data_.get_deleter(); }
330
334 NEFORCE_CONSTEXPR20 deleter_type&& get_deleter() && noexcept { return _NEFORCE move(data_).get_deleter(); }
338 NEFORCE_CONSTEXPR20 const deleter_type&& get_deleter() const&& noexcept {
339 return _NEFORCE move(data_).get_deleter();
340 }
341
346 NEFORCE_CONSTEXPR20 explicit operator bool() const noexcept { return get() != pointer(); }
347
351 NEFORCE_CONSTEXPR20 pointer release() noexcept { return data_.release(); }
352
356 NEFORCE_CONSTEXPR20 void reset(pointer ptr = pointer()) noexcept {
358 "deleter of unique_ptr must be invocable with a pointer");
359 data_.reset(_NEFORCE move(ptr));
360 }
361
366 NEFORCE_CONSTEXPR20 void swap(unique_ptr& other) noexcept {
367 static_assert(is_swappable<Deleter>::value, "deleter must be swappable.");
368 data_.swap(other.data_);
369 }
370
371 unique_ptr(const unique_ptr&) = delete;
372 unique_ptr& operator=(const unique_ptr&) = delete;
373};
374
380template <typename T, typename Deleter>
381class unique_ptr<T[], Deleter> {
382 template <typename U>
383 using DeleterConstraint = typename inner::__unique_ptr_impl<T, U>::DeleterConstraint::type;
384
385 inner::__unique_ptr_data<T, Deleter> data_{};
386
387public:
388 using pointer = typename inner::__unique_ptr_impl<T, Deleter>::pointer;
389 using element_type = T;
390 using deleter_type = Deleter;
391
392private:
393 template <typename U, typename E, typename UP = unique_ptr<U, E>, typename UP_pointer = typename UP::pointer,
394 typename UP_element_type = typename UP::element_type>
395 using safe_conversion =
397 is_convertible<UP_element_type (*)[], element_type (*)[]>>;
398
399 template <typename U>
400 using safe_conversion_raw =
404
405public:
412 template <typename U, typename Del = Deleter, typename = DeleterConstraint<Del>,
413 enable_if_t<safe_conversion_raw<U>::value, int> = 0>
414 NEFORCE_CONSTEXPR20 explicit unique_ptr(U ptr) noexcept :
415 data_(ptr) {}
416
424 template <typename U, typename Del = deleter_type,
426 NEFORCE_CONSTEXPR20 unique_ptr(U ptr, const deleter_type& deleter) noexcept :
427 data_(ptr, deleter) {}
428
436 template <typename U, typename Del = deleter_type,
438 NEFORCE_CONSTEXPR20 unique_ptr(U ptr, enable_if_t<!is_lvalue_reference<Del>::value, Del&&> deleter) noexcept :
439 data_(_NEFORCE move(ptr), _NEFORCE move(deleter)) {}
440
444 template <typename U, typename Del = deleter_type, typename DelMoveRef = remove_reference_t<Del>,
445 enable_if_t<safe_conversion_raw<U>::value, int> = 0>
447
448 unique_ptr(unique_ptr&&) = default;
449
454 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
455 constexpr unique_ptr(nullptr_t = nullptr) noexcept {}
456
463 template <typename U, typename E,
467 int> = 0>
468 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr<U, E>&& other) noexcept :
469 data_(other.release(), _NEFORCE forward<E>(other.get_deleter())) {}
470
474 NEFORCE_CONSTEXPR20 ~unique_ptr() {
475 auto& ptr = data_.get_ptr();
476 if (ptr != nullptr) {
477 get_deleter()(ptr);
478 }
479 ptr = pointer();
480 }
481
483
491 template <typename U, typename E,
493 NEFORCE_CONSTEXPR20 unique_ptr& operator=(unique_ptr<U, E>&& other) noexcept {
494 unique_ptr::reset(other.release());
495 get_deleter() = _NEFORCE forward<E>(other.get_deleter());
496 return *this;
497 }
498
503 NEFORCE_CONSTEXPR20 unique_ptr& operator=(nullptr_t) noexcept {
504 reset();
505 return *this;
506 }
507
513 NEFORCE_CONSTEXPR20 add_lvalue_reference_t<element_type> operator[](size_t idx) const {
514 NEFORCE_DEBUG_VERIFY(get() != pointer(), "_NEFORCE add_lvalue_reference_t<element_type> failed");
515 return get()[idx];
516 }
517
521 NEFORCE_CONSTEXPR20 pointer get() const noexcept { return data_.get_ptr(); }
522
526 NEFORCE_CONSTEXPR20 deleter_type& get_deleter() noexcept { return data_.get_deleter(); }
527
531 NEFORCE_CONSTEXPR20 const deleter_type& get_deleter() const noexcept { return data_.get_deleter(); }
532
537 NEFORCE_CONSTEXPR20 explicit operator bool() const noexcept { return get() != pointer(); }
538
542 NEFORCE_CONSTEXPR20 pointer release() noexcept { return data_.release(); }
543
549 template <typename U,
553 is_convertible<remove_pointer_t<U> (*)[], element_type (*)[]>>>>::value,
554 int> = 0>
555 NEFORCE_CONSTEXPR20 void reset(U ptr) noexcept {
556 data_.reset(_NEFORCE move(ptr));
557 }
558
562 NEFORCE_CONSTEXPR20 void reset(nullptr_t = nullptr) noexcept { unique_ptr::reset(pointer()); }
563
568 NEFORCE_CONSTEXPR20 void swap(unique_ptr& other) noexcept { data_.swap(other.data_); }
569
570 unique_ptr(const unique_ptr&) = delete;
571 unique_ptr& operator=(const unique_ptr&) = delete;
572};
573
581template <typename T, typename Deleter, enable_if_t<is_swappable<Deleter>::value && is_swappable<T>::value, int> = 0>
583 lhs.swap(rhs);
584}
585
596template <typename T, typename D, typename U, typename E>
597NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
598 return lhs.get() == rhs.get();
599}
600
608template <typename T, typename D>
609NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const unique_ptr<T, D>& lhs, nullptr_t) {
610 return !lhs;
611}
612
620template <typename T, typename D>
621NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(nullptr_t, const unique_ptr<T, D>& rhs) {
622 return !rhs;
623}
624
635template <typename T, typename D, typename U, typename E>
636NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
637 return lhs.get() != rhs.get();
638}
639
647template <typename T, typename D>
648NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(const unique_ptr<T, D>& lhs, nullptr_t) {
649 return static_cast<bool>(lhs);
650}
651
659template <typename T, typename D>
660NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(nullptr_t, const unique_ptr<T, D>& rhs) {
661 return static_cast<bool>(rhs);
662}
663
674template <typename T, typename D, typename U, typename E>
675NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
677 return _NEFORCE less<common_t>()(lhs.get(), rhs.get());
678}
679
687template <typename T, typename D>
688NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const unique_ptr<T, D>& lhs, nullptr_t) {
689 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(lhs.get(), nullptr);
690}
691
699template <typename T, typename D>
700NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(nullptr_t, const unique_ptr<T, D>& rhs) {
701 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(nullptr, rhs.get());
702}
703
714template <typename T, typename D, typename U, typename E>
715NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
716 return rhs.get() < lhs.get();
717}
718
726template <typename T, typename D>
727NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(const unique_ptr<T, D>& lhs, nullptr_t) {
728 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(nullptr, lhs.get());
729}
730
738template <typename T, typename D>
739NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(nullptr_t, const unique_ptr<T, D>& rhs) {
740 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(rhs.get(), nullptr);
741}
742
753template <typename T, typename D, typename U, typename E>
754NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
755 return !(lhs > rhs);
756}
757
765template <typename T, typename D>
766NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(const unique_ptr<T, D>& lhs, nullptr_t) {
767 return !(lhs > nullptr);
768}
769
777template <typename T, typename D>
778NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(nullptr_t, const unique_ptr<T, D>& rhs) {
779 return !(nullptr > rhs);
780}
781
792template <typename T, typename D, typename U, typename E>
793NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
794 return !(lhs < rhs);
795}
796
804template <typename T, typename D>
805NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(const unique_ptr<T, D>& lhs, nullptr_t) {
806 return !(lhs < nullptr);
807}
808
816template <typename T, typename D>
817NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(nullptr_t, const unique_ptr<T, D>& rhs) {
818 return !(nullptr < rhs);
819}
820
821
830template <typename T, typename U, typename Deleter>
832
841template <typename T, typename U, typename Deleter>
843
852template <typename T, typename U, typename Deleter>
854
863template <typename T, typename U, typename Deleter>
865
866
877template <typename T, typename DeleterT, typename U, typename DeleterU>
879 DeleterU&& deleter = _NEFORCE move(ptr).get_deleter();
880 return unique_ptr<T, DeleterT>(static_cast<T*>(ptr.release()), _NEFORCE move(deleter).template rebind<T>());
881}
882
893template <typename T, typename DeleterT, typename U, typename DeleterU>
895 DeleterU&& deleter = _NEFORCE move(ptr).get_deleter();
896 return unique_ptr<T, DeleterT>(const_cast<T*>(ptr.release()), _NEFORCE move(deleter).template rebind<T>());
897}
898
909template <typename T, typename DeleterT, typename U, typename DeleterU>
911 DeleterU&& deleter = _NEFORCE move(ptr).get_deleter();
912 return unique_ptr<T, DeleterT>(reinterpret_cast<T*>(ptr.release()), _NEFORCE move(deleter).template rebind<T>());
913}
914
925template <typename T, typename DeleterT, typename U, typename DeleterU>
927 T* tmp = dynamic_cast<T*>(ptr.get());
928 if (tmp != nullptr) {
929 (void) ptr.release();
930 DeleterU&& deleter = _NEFORCE move(ptr).get_deleter();
931 return {tmp, _NEFORCE move(deleter).template rebind<T>()};
932 }
933 DeleterU&& deleter = _NEFORCE move(ptr).get_deleter();
934 return {nullptr, _NEFORCE move(deleter).template rebind<T>()};
935}
936 // UniquePointer
938
943
949template <typename T, typename Deleter>
950struct hash<unique_ptr<T, Deleter>> {
951 NEFORCE_CONSTEXPR20 size_t operator()(const unique_ptr<T, Deleter>& ptr) const
952 noexcept(noexcept(hash<T*>()(ptr.get()))) {
953 return hash<T*>()(ptr.get());
954 }
955};
956 // HashPrimary
958
964
972template <typename T, typename... Args, enable_if_t<!is_array<T>::value, int> = 0>
973NEFORCE_CONSTEXPR20 unique_ptr<T> make_unique(Args&&... args) {
974 return unique_ptr<T>(new T(_NEFORCE forward<Args>(args)...));
975}
976
983template <typename T, enable_if_t<is_unbounded_array<T>::value, int> = 0>
984NEFORCE_CONSTEXPR20 unique_ptr<T> make_unique(const size_t len) {
985 return unique_ptr<T>(new remove_extent_t<T>[len]());
986}
987
993template <typename T, typename... Args, enable_if_t<is_bounded_array<T>::value, int> = 0>
994unique_ptr<T> make_unique(Args&&...) = delete;
995 // UniquePointer
997
998NEFORCE_END_NAMESPACE__
999#endif // NEFORCE_CORE_MEMORY_UNIQUE_PTR_HPP__
unique_ptr(unique_ptr &&)=default
移动构造函数
constexpr pointer get() const noexcept
获取原始指针
typename inner::__unique_ptr_impl< T, Deleter >::pointer pointer
指针类型
unique_ptr & operator=(unique_ptr &&)=default
移动赋值运算符
unique_ptr(U, enable_if_t< is_lvalue_reference< Del >::value, DelMoveRef && >)=delete
禁止从右值引用删除器构造
constexpr void reset(nullptr_t=nullptr) noexcept
重置为空指针
constexpr unique_ptr(U ptr, enable_if_t<!is_lvalue_reference< Del >::value, Del && > deleter) noexcept
从指针和移动删除器构造
constexpr void reset(U ptr) noexcept
重置管理的指针
constexpr pointer release() noexcept
释放所有权
constexpr const deleter_type & get_deleter() const noexcept
获取删除器常量引用
constexpr deleter_type & get_deleter() noexcept
获取删除器引用
constexpr unique_ptr(U ptr) noexcept
从指针构造
constexpr unique_ptr(nullptr_t=nullptr) noexcept
空指针构造
constexpr unique_ptr(U ptr, const deleter_type &deleter) noexcept
从指针和复制删除器构造
unique_ptr & operator=(const unique_ptr &)=delete
禁止复制赋值
constexpr unique_ptr & operator=(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr移动赋值
Deleter deleter_type
删除器类型
constexpr unique_ptr & operator=(nullptr_t) noexcept
nullptr赋值运算符
constexpr unique_ptr(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr转换构造
constexpr void swap(unique_ptr &other) noexcept
交换两个unique_ptr
constexpr ~unique_ptr()
析构函数
unique_ptr(const unique_ptr &)=delete
禁止复制构造
constexpr add_lvalue_reference_t< element_type > operator[](size_t idx) const
数组下标运算符
独占智能指针
~unique_ptr() noexcept
析构函数
unique_ptr(const unique_ptr &)=delete
禁止复制构造
constexpr unique_ptr(nullptr_t=nullptr) noexcept
空指针构造
constexpr unique_ptr & operator=(nullptr_t) noexcept
nullptr赋值运算符
constexpr const deleter_type && get_deleter() const &&noexcept
获取删除器常量引用
constexpr pointer operator->() const noexcept
成员访问运算符
constexpr unique_ptr(pointer ptr) noexcept
从指针构造
constexpr const deleter_type & get_deleter() const &noexcept
获取删除器常量引用
constexpr pointer release() noexcept
constexpr deleter_type && get_deleter() &&noexcept
获取删除器引用
constexpr pointer get() const noexcept
获取原始指针
Deleter deleter_type
删除器类型
unique_ptr & operator=(unique_ptr &&) noexcept=default
移动赋值运算符
T element_type
元素类型
constexpr void reset(pointer ptr=pointer()) noexcept
重置管理的指针
constexpr unique_ptr(unique_ptr &&) noexcept=default
移动构造函数
constexpr deleter_type & get_deleter() &noexcept
constexpr void swap(unique_ptr &other) noexcept
交换两个unique_ptr
typename inner::__unique_ptr_impl< T, Deleter >::pointer pointer
指针类型
constexpr unique_ptr(pointer ptr, Del &&deleter) noexcept
从指针和复制删除器复制构造
constexpr add_lvalue_reference_t< element_type > operator*() const noexcept(noexcept(*_NEFORCE declval< pointer >()))
解引用运算符
unique_ptr & operator=(const unique_ptr &)=delete
禁止复制赋值
压缩对实现
智能指针删除器
仿函数
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
decltype(nullptr) nullptr_t
空指针类型
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
@ release
释放操作,确保前面的读写不会被重排到后面
typename remove_reference< T >::type remove_reference_t
remove_reference的便捷别名
typename remove_extent< T >::type remove_extent_t
remove_extent的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
typename common_type< Types... >::type common_type_t
common_type的便捷别名
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
void void_t
将任意类型映射为void
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
constexpr bool operator>(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
大于比较运算符
constexpr unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
constexpr bool operator<=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
小于等于比较运算符
unique_ptr< T, Deleter > reinterpret_pointer_cast(const unique_ptr< U, Deleter > &ptr)=delete
禁止的reinterpret_pointer_cast
constexpr bool operator>=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
大于等于比较运算符
unique_ptr< T, Deleter > dynamic_pointer_cast(const unique_ptr< U, Deleter > &ptr)=delete
禁止的dynamic_pointer_cast
constexpr bool operator==(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
相等比较运算符
unique_ptr< T, Deleter > static_pointer_cast(const unique_ptr< U, Deleter > &ptr)=delete
禁止的static_pointer_cast
unique_ptr< T, Deleter > const_pointer_cast(const unique_ptr< U, Deleter > &ptr)=delete
禁止的const_pointer_cast
constexpr bool operator<(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
小于比较运算符
constexpr bool operator!=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
不等比较运算符
统一调用接口
constexpr compressed_pair & get_base() &noexcept
获取基类引用
类型集合的逻辑与操作
类型集合的逻辑或操作
哈希函数的主模板
判断类型是否可以使用指定类型的值进行赋值
判断类型From是否可以隐式转换为类型To
判断类型是否可复制构造
判断类型是否可调用
判断类型是否可移动构造
判断类型是否为指针类型
判断类型是否为引用类型
判断两个类型是否相同
小于比较仿函数
逻辑非包装器