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 NEFORCE_CONSTEXPR20 __unique_ptr_impl(pointer ptr, Deleter&& deleter) :
65 ptr_pair_(exact_arg_construct_tag{}, _NEFORCE move(deleter), ptr) {}
66
67 NEFORCE_CONSTEXPR20 __unique_ptr_impl(pointer ptr, const Deleter& deleter) :
68 ptr_pair_(exact_arg_construct_tag{}, deleter, ptr) {}
69
70 NEFORCE_CONSTEXPR20 __unique_ptr_impl(__unique_ptr_impl&& other) noexcept :
71 ptr_pair_(_NEFORCE move(other.ptr_pair_)) {
72 other.get_ptr() = nullptr;
73 }
74
75 NEFORCE_CONSTEXPR20 __unique_ptr_impl& operator=(__unique_ptr_impl&& other) noexcept {
76 this->reset(other.release());
77 return *this;
78 }
79
80 NEFORCE_CONSTEXPR20 pointer& get_ptr() noexcept { return ptr_pair_.value; }
81
82 NEFORCE_CONSTEXPR20 pointer get_ptr() const noexcept { return ptr_pair_.value; }
83
84 NEFORCE_CONSTEXPR20 Deleter& get_deleter() noexcept { return ptr_pair_.get_base(); }
85
86 NEFORCE_CONSTEXPR20 const Deleter& get_deleter() const noexcept { return ptr_pair_.get_base(); }
87
88 NEFORCE_CONSTEXPR20 void reset(pointer ptr) noexcept {
89 const pointer old = get_ptr();
90 get_ptr() = ptr;
91 if (old) {
92 ptr_pair_.get_base()(old);
93 }
94 }
95
96 NEFORCE_CONSTEXPR20 pointer release() noexcept {
97 pointer p = get_ptr();
98 get_ptr() = nullptr;
99 return p;
100 }
101
102 NEFORCE_CONSTEXPR20 void swap(__unique_ptr_impl& other) noexcept { _NEFORCE swap(ptr_pair_, other.ptr_pair_); }
103};
104
115template <typename T, typename Deleter, bool MoveConstructible = is_move_constructible<Deleter>::value,
116 bool MoveAssignable = is_move_assignable<Deleter>::value>
117struct __unique_ptr_data : __unique_ptr_impl<T, Deleter> {
118 using base_type = __unique_ptr_impl<T, Deleter>;
119 using pointer = typename base_type::pointer;
120
121 __unique_ptr_data() = default;
122
123 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
124 base_type(ptr) {}
125
126 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Deleter&& deleter) :
127 base_type(ptr, _NEFORCE move(deleter)) {}
128
129 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, const Deleter& deleter) :
130 base_type(ptr, 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 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Deleter&& deleter) :
148 base_type(ptr, _NEFORCE move(deleter)) {}
149
150 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, const Deleter& deleter) :
151 base_type(ptr, deleter) {}
152
153 __unique_ptr_data(__unique_ptr_data&&) = default;
154 __unique_ptr_data& operator=(__unique_ptr_data&&) = delete;
155};
156
157// 删除器可移动赋值但不可移动构造
158template <typename T, typename Deleter>
159struct __unique_ptr_data<T, Deleter, false, true> : __unique_ptr_impl<T, Deleter> {
160 using base_type = __unique_ptr_impl<T, Deleter>;
161 using pointer = typename base_type::pointer;
162
163 __unique_ptr_data() = default;
164
165 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
166 base_type(ptr) {}
167
168 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Deleter&& deleter) :
169 base_type(ptr, _NEFORCE move(deleter)) {}
170
171 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, const Deleter& deleter) :
172 base_type(ptr, deleter) {}
173
174 __unique_ptr_data(__unique_ptr_data&&) = delete;
175 __unique_ptr_data& operator=(__unique_ptr_data&&) = default;
176};
177
178// 删除器既不可移动构造也不可移动赋值
179template <typename T, typename Deleter>
180struct __unique_ptr_data<T, Deleter, false, false> : __unique_ptr_impl<T, Deleter> {
181 using base_type = __unique_ptr_impl<T, Deleter>;
182 using pointer = typename base_type::pointer;
183
184 __unique_ptr_data() = default;
185
186 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr) :
187 base_type(ptr) {}
188
189 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, Deleter&& deleter) :
190 base_type(ptr, _NEFORCE move(deleter)) {}
191
192 NEFORCE_CONSTEXPR20 __unique_ptr_data(pointer ptr, const Deleter& deleter) :
193 base_type(ptr, deleter) {}
194
195 __unique_ptr_data(__unique_ptr_data&&) = delete;
196 __unique_ptr_data& operator=(__unique_ptr_data&&) = delete;
197};
198
199NEFORCE_END_INNER__
201
202
211template <typename T, typename Deleter = default_delete<T>>
213private:
214 template <typename U>
215 using DeleterConstraint = typename inner::__unique_ptr_impl<T, U>::DeleterConstraint::type;
216
217 inner::__unique_ptr_data<T, Deleter> data_{};
218
219public:
220 using pointer = typename inner::__unique_ptr_impl<T, Deleter>::pointer;
221 using element_type = T;
222 using deleter_type = Deleter;
223
224private:
225 template <typename U, typename E>
228
229public:
234 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
235 constexpr unique_ptr(nullptr_t = nullptr) noexcept {}
236
242 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
243 NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr) noexcept :
244 data_(ptr) {}
245
251 NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr, const deleter_type& deleter) noexcept :
252 data_(ptr, deleter) {}
253
259 NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr, deleter_type&& deleter) noexcept :
260 data_(ptr, _NEFORCE move(deleter)) {}
261
265 template <typename Del = deleter_type, typename DelMoveRef = remove_reference_t<Del>>
266 NEFORCE_CONSTEXPR20 unique_ptr(pointer, enable_if_t<is_lvalue_reference<Del>::value, DelMoveRef&&>) = delete;
267
268 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr&&) = default;
269
276 template <typename U, typename E,
280 int> = 0>
281 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr<U, E>&& other) noexcept :
282 data_(other.release(), _NEFORCE forward<E>(other.get_deleter())) {}
283
287 ~unique_ptr() noexcept {
289 "deleter of unique_ptr must be invocable with a pointer");
290
291 auto& ptr = data_.get_ptr();
292 if (ptr != nullptr) {
293 get_deleter()(_NEFORCE move(ptr));
294 }
295 ptr = pointer();
296 }
297
299
307 template <typename U, typename E,
309 NEFORCE_CONSTEXPR20 unique_ptr& operator=(unique_ptr<U, E>&& other) noexcept {
310 reset(other.release());
311 get_deleter() = _NEFORCE forward<E>(other.get_deleter());
312 return *this;
313 }
314
319 NEFORCE_CONSTEXPR20 unique_ptr& operator=(nullptr_t) noexcept {
320 reset();
321 return *this;
322 }
323
329 noexcept(noexcept(*_NEFORCE declval<pointer>())) {
330 return *get();
331 }
332
337 NEFORCE_CONSTEXPR20 pointer operator->() const noexcept { return get(); }
338
342 NEFORCE_CONSTEXPR20 pointer get() const noexcept { return data_.get_ptr(); }
343
347
348 NEFORCE_CONSTEXPR20 deleter_type& get_deleter() noexcept { return data_.get_deleter(); }
352 NEFORCE_CONSTEXPR20 const deleter_type& get_deleter() const noexcept { return data_.get_deleter(); }
353
358 NEFORCE_CONSTEXPR20 explicit operator bool() const noexcept { return get() == pointer() ? false : true; }
359
363 NEFORCE_CONSTEXPR20 pointer release() noexcept { return data_.release(); }
364
368 NEFORCE_CONSTEXPR20 void reset(pointer ptr = pointer()) noexcept {
370 "deleter of unique_ptr must be invocable with a pointer");
371 data_.reset(_NEFORCE move(ptr));
372 }
373
378 NEFORCE_CONSTEXPR20 void swap(unique_ptr& other) noexcept {
379 static_assert(is_swappable<Deleter>::value, "deleter must be swappable.");
380 data_.swap(other.data_);
381 }
382
383 unique_ptr(const unique_ptr&) = delete;
384 unique_ptr& operator=(const unique_ptr&) = delete;
385};
386
392template <typename T, typename Deleter>
393class unique_ptr<T[], Deleter> {
394 template <typename U>
395 using DeleterConstraint = typename inner::__unique_ptr_impl<T, U>::DeleterConstraint::type;
396
397 inner::__unique_ptr_data<T, Deleter> data_{};
398
399public:
400 using pointer = typename inner::__unique_ptr_impl<T, Deleter>::pointer;
401 using element_type = T;
402 using deleter_type = Deleter;
403
404private:
405 template <typename U, typename E, typename UP = unique_ptr<U, E>, typename UP_pointer = typename UP::pointer,
406 typename UP_element_type = typename UP::element_type>
407 using safe_conversion =
409 is_convertible<UP_element_type (*)[], element_type (*)[]>>;
410
411 template <typename U>
412 using safe_conversion_raw =
416
417public:
424 template <typename U, typename Del = Deleter, typename = DeleterConstraint<Del>,
425 enable_if_t<safe_conversion_raw<U>::value, int> = 0>
426 NEFORCE_CONSTEXPR20 explicit unique_ptr(U ptr) noexcept :
427 data_(ptr) {}
428
436 template <typename U, typename Del = deleter_type,
438 NEFORCE_CONSTEXPR20 unique_ptr(U ptr, const deleter_type& deleter) noexcept :
439 data_(ptr, deleter) {}
440
448 template <typename U, typename Del = deleter_type,
450 NEFORCE_CONSTEXPR20 unique_ptr(U ptr, enable_if_t<!is_lvalue_reference<Del>::value, Del&&> deleter) noexcept :
451 data_(_NEFORCE move(ptr), _NEFORCE move(deleter)) {}
452
456 template <typename U, typename Del = deleter_type, typename DelMoveRef = remove_reference_t<Del>,
457 enable_if_t<safe_conversion_raw<U>::value, int> = 0>
459
460 unique_ptr(unique_ptr&&) = default;
461
466 template <typename Del = Deleter, typename = DeleterConstraint<Del>>
467 constexpr unique_ptr(nullptr_t = nullptr) noexcept {}
468
475 template <typename U, typename E,
479 int> = 0>
480 NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr<U, E>&& other) noexcept :
481 data_(other.release(), _NEFORCE forward<E>(other.get_deleter())) {}
482
486 NEFORCE_CONSTEXPR20 ~unique_ptr() {
487 auto& ptr = data_.get_ptr();
488 if (ptr != nullptr) {
489 get_deleter()(ptr);
490 }
491 ptr = pointer();
492 }
493
495
503 template <typename U, typename E,
505 NEFORCE_CONSTEXPR20 unique_ptr& operator=(unique_ptr<U, E>&& other) noexcept {
506 unique_ptr::reset(other.release());
507 get_deleter() = _NEFORCE forward<E>(other.get_deleter());
508 return *this;
509 }
510
515 NEFORCE_CONSTEXPR20 unique_ptr& operator=(nullptr_t) noexcept {
516 reset();
517 return *this;
518 }
519
525 NEFORCE_CONSTEXPR20 add_lvalue_reference_t<element_type> operator[](size_t idx) const {
526 NEFORCE_DEBUG_VERIFY(get() != pointer(), "_NEFORCE add_lvalue_reference_t<element_type> failed");
527 return get()[idx];
528 }
529
533 NEFORCE_CONSTEXPR20 pointer get() const noexcept { return data_.get_ptr(); }
534
538 NEFORCE_CONSTEXPR20 deleter_type& get_deleter() noexcept { return data_.get_deleter(); }
539
543 NEFORCE_CONSTEXPR20 const deleter_type& get_deleter() const noexcept { return data_.get_deleter(); }
544
549 NEFORCE_CONSTEXPR20 explicit operator bool() const noexcept { return get() == pointer() ? false : true; }
550
554 NEFORCE_CONSTEXPR20 pointer release() noexcept { return data_.release(); }
555
561 template <typename U,
565 is_convertible<remove_pointer_t<U> (*)[], element_type (*)[]>>>>::value,
566 int> = 0>
567 NEFORCE_CONSTEXPR20 void reset(U ptr) noexcept {
568 data_.reset(_NEFORCE move(ptr));
569 }
570
574 NEFORCE_CONSTEXPR20 void reset(nullptr_t = nullptr) noexcept { unique_ptr::reset(pointer()); }
575
580 NEFORCE_CONSTEXPR20 void swap(unique_ptr& other) noexcept { data_.swap(other.data_); }
581
582 unique_ptr(const unique_ptr&) = delete;
583 unique_ptr& operator=(const unique_ptr&) = delete;
584};
585
593template <typename T, typename Deleter, enable_if_t<is_swappable<Deleter>::value && is_swappable<T>::value, int> = 0>
595 lhs.swap(rhs);
596}
597
608template <typename T, typename D, typename U, typename E>
609NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
610 return lhs.get() == rhs.get();
611}
612
620template <typename T, typename D>
621NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const unique_ptr<T, D>& lhs, nullptr_t) {
622 return !lhs;
623}
624
632template <typename T, typename D>
633NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(nullptr_t, const unique_ptr<T, D>& rhs) {
634 return !rhs;
635}
636
647template <typename T, typename D, typename U, typename E>
648NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
649 return lhs.get() != rhs.get();
650}
651
659template <typename T, typename D>
660NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(const unique_ptr<T, D>& lhs, nullptr_t) {
661 return static_cast<bool>(lhs);
662}
663
671template <typename T, typename D>
672NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(nullptr_t, const unique_ptr<T, D>& rhs) {
673 return static_cast<bool>(rhs);
674}
675
686template <typename T, typename D, typename U, typename E>
687NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
689 return _NEFORCE less<common_t>()(lhs.get(), rhs.get());
690}
691
699template <typename T, typename D>
700NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const unique_ptr<T, D>& lhs, nullptr_t) {
701 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(lhs.get(), nullptr);
702}
703
711template <typename T, typename D>
712NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(nullptr_t, const unique_ptr<T, D>& rhs) {
713 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(nullptr, rhs.get());
714}
715
726template <typename T, typename D, typename U, typename E>
727NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
728 return rhs.get() < lhs.get();
729}
730
738template <typename T, typename D>
739NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(const unique_ptr<T, D>& lhs, nullptr_t) {
740 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(nullptr, lhs.get());
741}
742
750template <typename T, typename D>
751NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(nullptr_t, const unique_ptr<T, D>& rhs) {
752 return _NEFORCE less<typename unique_ptr<T, D>::pointer>()(rhs.get(), nullptr);
753}
754
765template <typename T, typename D, typename U, typename E>
766NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
767 return !(lhs > rhs);
768}
769
777template <typename T, typename D>
778NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(const unique_ptr<T, D>& lhs, nullptr_t) {
779 return !(lhs > nullptr);
780}
781
789template <typename T, typename D>
790NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(nullptr_t, const unique_ptr<T, D>& rhs) {
791 return !(nullptr > rhs);
792}
793
804template <typename T, typename D, typename U, typename E>
805NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(const unique_ptr<T, D>& lhs, const unique_ptr<U, E>& rhs) {
806 return !(lhs < rhs);
807}
808
816template <typename T, typename D>
817NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(const unique_ptr<T, D>& lhs, nullptr_t) {
818 return !(lhs < nullptr);
819}
820
828template <typename T, typename D>
829NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(nullptr_t, const unique_ptr<T, D>& rhs) {
830 return !(nullptr < rhs);
831}
832
833
841template <typename T, typename U>
843
851template <typename T, typename U>
853
861template <typename T, typename U>
863
871template <typename T, typename U>
873
874
882template <typename T, typename U>
884 return unique_ptr<T>(static_cast<T*>(ptr.release()), ptr.get_deleter());
885}
886
894template <typename T, typename U>
896 return unique_ptr<T>(const_cast<T*>(ptr.release()), ptr.get_deleter());
897}
898
906template <typename T, typename U>
908 return unique_ptr<T>(reinterpret_cast<T*>(ptr.release()), ptr.get_deleter());
909}
910
918template <typename T, typename U>
920 T* tmp = dynamic_cast<T*>(ptr.release());
921 if (tmp != nullptr) {
922 return unique_ptr<T>(tmp, _NEFORCE move(ptr.get_deleter()).template rebind<T>());
923 }
924 return nullptr;
925}
926 // UniquePointer
928
933
939template <typename T, typename Deleter>
940struct hash<unique_ptr<T, Deleter>> {
941 NEFORCE_CONSTEXPR20 size_t operator()(const unique_ptr<T, Deleter>& ptr) const
942 noexcept(noexcept(hash<T>()(ptr.get()))) {
943 return hash<T>()(ptr.get());
944 }
945};
946 // HashPrimary
948
954
962template <typename T, typename... Args, enable_if_t<!is_array<T>::value, int> = 0>
963NEFORCE_CONSTEXPR20 unique_ptr<T> make_unique(Args&&... args) {
964 return unique_ptr<T>(new T(_NEFORCE forward<Args>(args)...));
965}
966
973template <typename T, enable_if_t<is_unbounded_array<T>::value, int> = 0>
974NEFORCE_CONSTEXPR20 unique_ptr<T> make_unique(const size_t len) {
975 return unique_ptr<T>(new remove_extent_t<T>[len]());
976}
977
983template <typename T, typename... Args, enable_if_t<is_bounded_array<T>::value, int> = 0>
984unique_ptr<T> make_unique(Args&&...) = delete;
985 // UniquePointer
987
988NEFORCE_END_NAMESPACE__
989#endif // NEFORCE_CORE_MEMORY_UNIQUE_PTR_HPP__
NEFORCE_CONSTEXPR20 unique_ptr(U ptr, enable_if_t<!is_lvalue_reference< Del >::value, Del && > deleter) noexcept
从指针和移动删除器构造
unique_ptr(unique_ptr &&)=default
移动构造函数
NEFORCE_CONSTEXPR20 const deleter_type & get_deleter() 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
禁止从右值引用删除器构造
NEFORCE_CONSTEXPR20 unique_ptr(U ptr) noexcept
从指针构造
NEFORCE_CONSTEXPR20 void reset(nullptr_t=nullptr) noexcept
重置为空指针
NEFORCE_CONSTEXPR20 add_lvalue_reference_t< element_type > operator[](size_t idx) const
数组下标运算符
NEFORCE_CONSTEXPR20 deleter_type & get_deleter() noexcept
获取删除器引用
constexpr unique_ptr(nullptr_t=nullptr) noexcept
空指针构造
NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr转换构造
unique_ptr & operator=(const unique_ptr &)=delete
禁止复制赋值
NEFORCE_CONSTEXPR20 void swap(unique_ptr &other) noexcept
交换两个unique_ptr
NEFORCE_CONSTEXPR20 unique_ptr(U ptr, const deleter_type &deleter) noexcept
从指针和复制删除器构造
NEFORCE_CONSTEXPR20 ~unique_ptr()
析构函数
NEFORCE_CONSTEXPR20 pointer get() const noexcept
获取原始指针
Deleter deleter_type
删除器类型
NEFORCE_CONSTEXPR20 void reset(U ptr) noexcept
重置管理的指针
NEFORCE_CONSTEXPR20 unique_ptr & operator=(nullptr_t) noexcept
nullptr赋值运算符
NEFORCE_CONSTEXPR20 unique_ptr & operator=(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr移动赋值
unique_ptr(const unique_ptr &)=delete
禁止复制构造
NEFORCE_CONSTEXPR20 pointer release() noexcept
释放所有权
独占智能指针
~unique_ptr() noexcept
析构函数
unique_ptr(const unique_ptr &)=delete
禁止复制构造
NEFORCE_CONSTEXPR20 const deleter_type & get_deleter() const noexcept
获取删除器常量引用
constexpr unique_ptr(nullptr_t=nullptr) noexcept
空指针构造
NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr, const deleter_type &deleter) noexcept
从指针和复制删除器复制构造
NEFORCE_CONSTEXPR20 void reset(pointer ptr=pointer()) noexcept
重置管理的指针
NEFORCE_CONSTEXPR20 pointer release() noexcept
释放所有权
NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr) noexcept
从指针构造
Deleter deleter_type
删除器类型
T element_type
元素类型
NEFORCE_CONSTEXPR20 add_lvalue_reference_t< element_type > operator*() const noexcept(noexcept(*_NEFORCE declval< pointer >()))
解引用运算符
NEFORCE_CONSTEXPR20 deleter_type & get_deleter() noexcept
获取删除器引用
NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr &&)=default
移动构造函数
NEFORCE_CONSTEXPR20 unique_ptr & operator=(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr移动赋值
NEFORCE_CONSTEXPR20 pointer get() const noexcept
获取原始指针
NEFORCE_CONSTEXPR20 unique_ptr & operator=(nullptr_t) noexcept
nullptr赋值运算符
NEFORCE_CONSTEXPR20 unique_ptr(pointer, enable_if_t< is_lvalue_reference< Del >::value, DelMoveRef && >)=delete
禁止从右值引用删除器构造
NEFORCE_CONSTEXPR20 unique_ptr(unique_ptr< U, E > &&other) noexcept
从其他unique_ptr转换构造
NEFORCE_CONSTEXPR20 pointer operator->() const noexcept
成员访问运算符
NEFORCE_CONSTEXPR20 void swap(unique_ptr &other) noexcept
交换两个unique_ptr
NEFORCE_CONSTEXPR20 unique_ptr(pointer ptr, deleter_type &&deleter) noexcept
从指针和移动删除器移动构造
typename inner::__unique_ptr_impl< T, Deleter >::pointer pointer
指针类型
unique_ptr & operator=(unique_ptr &&)=default
移动赋值运算符
unique_ptr & operator=(const unique_ptr &)=delete
禁止复制赋值
压缩对实现
智能指针删除器
仿函数
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
decltype(nullptr) nullptr_t
空指针类型
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
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的便捷别名
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator!=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
不等比较运算符
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
相等比较运算符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
大于等于比较运算符
unique_ptr< T > reinterpret_pointer_cast(const unique_ptr< U > &ptr)=delete
禁止的reinterpret_pointer_cast
unique_ptr< T > const_pointer_cast(const unique_ptr< U > &ptr)=delete
禁止的const_pointer_cast
unique_ptr< T > static_pointer_cast(const unique_ptr< U > &ptr)=delete
禁止的static_pointer_cast
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
小于比较运算符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<=(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
小于等于比较运算符
unique_ptr< T > dynamic_pointer_cast(const unique_ptr< U > &ptr)=delete
禁止的dynamic_pointer_cast
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator>(const unique_ptr< T, D > &lhs, const unique_ptr< U, E > &rhs)
大于比较运算符
统一调用接口
constexpr compressed_pair & get_base() noexcept
获取基类引用
类型集合的逻辑与操作
类型集合的逻辑或操作
哈希函数的主模板
判断类型是否可以使用指定类型的值进行赋值
判断类型From是否可以隐式转换为类型To
判断类型是否可复制构造
判断类型是否可调用
判断类型是否可移动构造
判断类型是否为指针类型
判断两个类型是否相同
小于比较仿函数
逻辑非包装器