UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UniquePtr.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
7#include "Templates/IsArray.h"
11#include <type_traits>
12
13// Single-ownership smart pointer in the vein of std::unique_ptr.
14// Use this when you need an object's lifetime to be strictly bound to the lifetime of a single smart pointer.
15//
16// This class is non-copyable - ownership can only be transferred via a move operation, e.g.:
17//
18// TUniquePtr<MyClass> Ptr1(new MyClass); // The MyClass object is owned by Ptr1.
19// TUniquePtr<MyClass> Ptr2(Ptr1); // Error - TUniquePtr is not copyable
20// TUniquePtr<MyClass> Ptr3(MoveTemp(Ptr1)); // Ptr3 now owns the MyClass object - Ptr1 is now nullptr.
21//
22// If you provide a custom deleter, it is up to your deleter to handle null pointers. This is a departure
23// from std::unique_ptr which will not invoke the deleter if the owned pointer is null:
24// https://en.cppreference.com/w/cpp/memory/unique_ptr/~unique_ptr
25
26template <typename T>
28{
30
31 TDefaultDelete() = default;
32 TDefaultDelete(const TDefaultDelete&) = default;
34 ~TDefaultDelete() = default;
35
36 template <
37 typename U
38 UE_REQUIRES(std::is_convertible_v<U*, T*>)
39 >
43
44 template <
45 typename U
46 UE_REQUIRES(std::is_convertible_v<U*, T*>)
47 >
49 {
50 return *this;
51 }
52
53 void operator()(T* Ptr) const
54 {
55 // If you get an error here when trying to use a TUniquePtr<FForwardDeclaredType> inside a UObject then:
56 //
57 // * Declare all your UObject's constructors and destructor in the .h file.
58 // * Define all of them in the .cpp file. You can use UMyObject::UMyObject() = default; to auto-generate
59 // the default constructor and destructor so that they don't have to be manually maintained.
60 // * Define a UMyObject(FVTableHelper& Helper) constructor too, otherwise it will be defined in the
61 // .gen.cpp file where your pimpl type doesn't exist. It cannot be defaulted, but it need not
62 // contain any particular implementation; the object just needs to be garbage collectable.
63 //
64 // If efficiency is less important than simplicity, you may want to consider
65 // using a TPimplPtr instead, though it is also pretty efficient.
66 delete Ptr;
67 }
68};
69
70template <typename T>
71struct TDefaultDelete<T[]>
72{
73 TDefaultDelete() = default;
74 TDefaultDelete(const TDefaultDelete&) = default;
76 ~TDefaultDelete() = default;
77
78 template <
79 typename U
80 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
81 >
83 {
84 }
85
86 template <
87 typename U
88 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
89 >
91 {
92 return *this;
93 }
94
95 template <
96 typename U
97 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
98 >
99 void operator()(U* Ptr) const
100 {
101 delete [] Ptr;
102 }
103};
104
105template <typename T, typename Deleter = TDefaultDelete<T>>
106class TUniquePtr : private Deleter
107{
109
110 template <typename OtherT, typename OtherDeleter>
111 friend class TUniquePtr;
112
113public:
114 using ElementType = T;
115
116 // Non-copyable
117 TUniquePtr(const TUniquePtr&) = delete;
118 TUniquePtr& operator=(const TUniquePtr&) = delete;
119
123 inline constexpr TUniquePtr()
124 : Deleter()
125 , Ptr (nullptr)
126 {
127 }
128
134 template <
135 typename U
136 UE_REQUIRES(std::is_convertible_v<U*, T*>)
137 >
138 explicit inline TUniquePtr(U* InPtr)
139 : Deleter()
140 , Ptr (InPtr)
141 {
142 }
143
149 template <
150 typename U
151 UE_REQUIRES(std::is_convertible_v<U*, T*>)
152 >
153 explicit inline TUniquePtr(U* InPtr, Deleter&& InDeleter)
154 : Deleter(MoveTemp(InDeleter))
155 , Ptr (InPtr)
156 {
157 }
158
164 template <
165 typename U
166 UE_REQUIRES(std::is_convertible_v<U*, T*>)
167 >
168 explicit inline TUniquePtr(U* InPtr, const Deleter& InDeleter)
169 : Deleter(InDeleter)
170 , Ptr (InPtr)
171 {
172 }
173
178 : Deleter()
179 , Ptr (nullptr)
180 {
181 }
182
187 : Deleter(MoveTemp(Other.GetDeleter()))
188 , Ptr (Other.Ptr)
189 {
190 Other.Ptr = nullptr;
191 }
192
196 template <
197 typename OtherT,
198 typename OtherDeleter
200 !std::is_array_v<OtherT> &&
201 std::is_convertible_v<OtherT*, T*>
202 )
203 >
205 : Deleter(MoveTemp(Other.GetDeleter()))
206 , Ptr (Other.Ptr)
207 {
208 Other.Ptr = nullptr;
209 }
210
215 {
216 if (this != &Other)
217 {
218 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this or Other
219 T* OldPtr = Ptr;
220 Ptr = Other.Ptr;
221 Other.Ptr = nullptr;
223 }
224
225 GetDeleter() = MoveTemp(Other.GetDeleter());
226
227 return *this;
228 }
229
233 template <
234 typename OtherT,
235 typename OtherDeleter
237 !std::is_array_v<OtherT> &&
238 std::is_convertible_v<OtherT*, T*>
239 )
240 >
242 {
243 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this or Other
244 T* OldPtr = Ptr;
245 Ptr = Other.Ptr;
246 Other.Ptr = nullptr;
248
249 GetDeleter() = MoveTemp(Other.GetDeleter());
250
251 return *this;
252 }
253
258 {
259 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this
260 T* OldPtr = Ptr;
261 Ptr = nullptr;
263
264 return *this;
265 }
266
271 {
272 GetDeleter()(Ptr);
273 }
274
280 [[nodiscard]] bool IsValid() const
281 {
282 return Ptr != nullptr;
283 }
284
290 [[nodiscard]] UE_FORCEINLINE_HINT explicit operator bool() const
291 {
292 return IsValid();
293 }
294
301 {
302 return Ptr;
303 }
304
310 template <
311 typename DummyT = T
312 UE_REQUIRES(UE_REQUIRES_EXPR(*(DummyT*)nullptr)) // this construct means that operator* is only considered for overload resolution if T is dereferenceable
313 >
315 {
316 return *Ptr;
317 }
318
325 {
326 return Ptr;
327 }
328
334 [[nodiscard]] inline T* Release()
335 {
336 T* Result = Ptr;
337 Ptr = nullptr;
338 return Result;
339 }
340
346 inline void Reset(T* InPtr = nullptr)
347 {
348 if (Ptr != InPtr)
349 {
350 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this
351 T* OldPtr = Ptr;
352 Ptr = InPtr;
354 }
355 }
356
363 {
364 return static_cast<Deleter&>(*this);
365 }
366
372 [[nodiscard]] UE_FORCEINLINE_HINT const Deleter& GetDeleter() const
373 {
374 return static_cast<const Deleter&>(*this);
375 }
376
377private:
378 using PtrType = T*;
379 LAYOUT_FIELD(PtrType, Ptr);
380
381public:
390 template <typename RhsT>
392 {
393 return Get() == Rhs.Get();
394 }
395
404 template <typename RhsT>
406 {
407 return Get() < Rhs.Get();
408 }
409
418 template <typename RhsT>
420 {
421 return Get() > Rhs.Get();
422 }
423
432 template <typename RhsT>
434 {
435 return Get() <= Rhs.Get();
436 }
437
446 template <typename RhsT>
448 {
449 return Get() >= Rhs.Get();
450 }
451
460 {
461 return !IsValid();
462 }
463
464#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
473 template <typename RhsT>
475 {
476 return Get() != Rhs.Get();
477 }
478
487 {
488 return IsValid();
489 }
490#endif
491
493 {
494 return GetTypeHash(UniquePtr.Get());
495 }
496};
497
498template <typename T, typename Deleter>
499class TUniquePtr<T[], Deleter> : private Deleter
500{
501 template <typename OtherT, typename OtherDeleter>
502 friend class TUniquePtr;
503
504public:
505 using ElementType = T;
506
507 // Non-copyable
508 TUniquePtr(const TUniquePtr&) = delete;
509 TUniquePtr& operator=(const TUniquePtr&) = delete;
510
514 inline constexpr TUniquePtr()
515 : Deleter()
516 , Ptr (nullptr)
517 {
518 }
519
525 template <
526 typename U
527 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
528 >
529 explicit inline TUniquePtr(U* InPtr)
530 : Deleter()
531 , Ptr (InPtr)
532 {
533 }
534
540 template <
541 typename U
542 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
543 >
544 explicit inline TUniquePtr(U* InPtr, Deleter&& InDeleter)
545 : Deleter(MoveTemp(InDeleter))
546 , Ptr (InPtr)
547 {
548 }
549
555 template <
556 typename U
557 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
558 >
559 explicit inline TUniquePtr(U* InPtr, const Deleter& InDeleter)
560 : Deleter(InDeleter)
561 , Ptr (InPtr)
562 {
563 }
564
568 inline constexpr TUniquePtr(TYPE_OF_NULLPTR)
569 : Deleter()
570 , Ptr (nullptr)
571 {
572 }
573
578 : Deleter(MoveTemp(Other.GetDeleter()))
579 , Ptr (Other.Ptr)
580 {
581 Other.Ptr = nullptr;
582 }
583
587 template <
588 typename OtherT,
589 typename OtherDeleter
590 UE_REQUIRES(std::is_convertible_v<OtherT(*)[], T(*)[]>)
591 >
593 : Deleter(MoveTemp(Other.GetDeleter()))
594 , Ptr (Other.Ptr)
595 {
596 Other.Ptr = nullptr;
597 }
598
603 {
604 if (this != &Other)
605 {
606 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this or Other
607 T* OldPtr = Ptr;
608 Ptr = Other.Ptr;
609 Other.Ptr = nullptr;
611 }
612
613 GetDeleter() = MoveTemp(Other.GetDeleter());
614
615 return *this;
616 }
617
621 template <
622 typename OtherT,
623 typename OtherDeleter
624 UE_REQUIRES(std::is_convertible_v<OtherT(*)[], T(*)[]>)
625 >
627 {
628 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this or Other
629 T* OldPtr = Ptr;
630 Ptr = Other.Ptr;
631 Other.Ptr = nullptr;
633
634 GetDeleter() = MoveTemp(Other.GetDeleter());
635
636 return *this;
637 }
638
643 {
644 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this
645 T* OldPtr = Ptr;
646 Ptr = nullptr;
648
649 return *this;
650 }
651
656 {
657 GetDeleter()(Ptr);
658 }
659
665 [[nodiscard]] bool IsValid() const
666 {
667 return Ptr != nullptr;
668 }
669
675 [[nodiscard]] UE_FORCEINLINE_HINT explicit operator bool() const
676 {
677 return IsValid();
678 }
679
686 {
687 return Ptr[Index];
688 }
689
696 {
697 return Ptr;
698 }
699
705 [[nodiscard]] inline T* Release()
706 {
707 T* Result = Ptr;
708 Ptr = nullptr;
709 return Result;
710 }
711
717 template <
718 typename U
719 UE_REQUIRES(std::is_convertible_v<U(*)[], T(*)[]>)
720 >
721 inline void Reset(U* InPtr)
722 {
723 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this
724 T* OldPtr = Ptr;
725 Ptr = InPtr;
727 }
728
729 inline void Reset(TYPE_OF_NULLPTR InPtr = nullptr)
730 {
731 // We delete last, because we don't want odd side effects if the destructor of T relies on the state of this
732 T* OldPtr = Ptr;
733 Ptr = InPtr;
735 }
736
743 {
744 return static_cast<Deleter&>(*this);
745 }
746
752 [[nodiscard]] UE_FORCEINLINE_HINT const Deleter& GetDeleter() const
753 {
754 return static_cast<const Deleter&>(*this);
755 }
756
757private:
758 T* Ptr;
759
760public:
769 template <typename RhsT>
771 {
772 return Get() == Rhs.Get();
773 }
774
783 template <typename RhsT>
785 {
786 return Get() < Rhs.Get();
787 }
788
797 template <typename RhsT>
799 {
800 return Get() > Rhs.Get();
801 }
802
811 template <typename RhsT>
813 {
814 return Get() <= Rhs.Get();
815 }
816
825 template <typename RhsT>
827 {
828 return Get() >= Rhs.Get();
829 }
830
839 {
840 return !IsValid();
841 }
842
843#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
852 template <typename RhsT>
854 {
855 return Get() != Rhs.Get();
856 }
857
866 {
867 return IsValid();
868 }
869#endif
870
872 {
873 return GetTypeHash(UniquePtr.Get());
874 }
875};
876
877#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
878template <typename T>
880{
881 return !Rhs.IsValid();
882}
883
884template <typename T>
886{
887 return Rhs.IsValid();
888}
889#endif
890
891// Trait which allows TUniquePtr to be default constructed by memsetting to zero.
892template <typename T>
894{
895 enum { Value = true };
896};
897
898// Trait which allows TUniquePtr to be memcpy'able from pointers.
899template <typename T>
901{
902 enum { Value = true };
903};
904
913template <
914 typename T,
915 typename... TArgs
916 UE_REQUIRES(!std::is_array_v<T>)
917>
919{
920 return TUniquePtr<T>(new T(Forward<TArgs>(Args)...));
921}
922
931template <
932 typename T,
933 typename... TArgs
934 UE_REQUIRES(!std::is_array_v<T>)
935>
940
949template <
950 typename T
952>
954{
955 using ElementType = std::remove_extent_t<T>;
956 return TUniquePtr<T>(new ElementType[Size]());
957}
958
967template <
968 typename T
970>
972{
973 using ElementType = std::remove_extent_t<T>;
974 return TUniquePtr<T>(new ElementType[Size]);
975}
976
980template <
981 typename T,
982 typename... TArgs
984>
985TUniquePtr<T> MakeUnique(TArgs&&... Args) = delete;
986
990template <typename T> constexpr bool TIsTUniquePtr_V = false;
991template <typename T, typename Deleter> constexpr bool TIsTUniquePtr_V< TUniquePtr<T, Deleter>> = true;
992template <typename T, typename Deleter> constexpr bool TIsTUniquePtr_V<const TUniquePtr<T, Deleter>> = true;
993template <typename T, typename Deleter> constexpr bool TIsTUniquePtr_V< volatile TUniquePtr<T, Deleter>> = true;
994template <typename T, typename Deleter> constexpr bool TIsTUniquePtr_V<const volatile TUniquePtr<T, Deleter>> = true;
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TYPE_OF_NULLPTR TYPE_OF_NULLPTR
The type of the C++ nullptr keyword.
Definition Platform.h:1157
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define LAYOUT_FIELD(T, Name,...)
Definition MemoryLayout.h:471
#define DECLARE_INLINE_TYPE_LAYOUT_EXPLICIT_BASES(T, Interface,...)
Definition MemoryLayout.h:562
const bool
Definition NetworkReplayStreaming.h:178
#define UE_REQUIRES(...)
Definition Requires.h:86
#define UE_REQUIRES_EXPR(...)
Definition Requires.h:89
UE_FORCEINLINE_HINT bool operator!=(TYPE_OF_NULLPTR, const TUniquePtr< T > &Rhs)
Definition UniquePtr.h:885
UE_FORCEINLINE_HINT bool operator==(TYPE_OF_NULLPTR, const TUniquePtr< T > &Rhs)
Definition UniquePtr.h:879
constexpr bool TIsTUniquePtr_V
Definition UniquePtr.h:990
UE_FORCEINLINE_HINT TUniquePtr< T > MakeUnique(TArgs &&... Args)
Definition UniquePtr.h:918
UE_FORCEINLINE_HINT TUniquePtr< T > MakeUniqueForOverwrite()
Definition UniquePtr.h:936
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
uint32_t uint32
Definition binka_ue_file_header.h:6
TUniquePtr(const TUniquePtr &)=delete
UE_FORCEINLINE_HINT bool operator!=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:853
UE_FORCEINLINE_HINT bool operator>(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:798
T * Release()
Definition UniquePtr.h:705
TUniquePtr(U *InPtr, const Deleter &InDeleter)
Definition UniquePtr.h:559
bool IsValid() const
Definition UniquePtr.h:665
UE_FORCEINLINE_HINT const Deleter & GetDeleter() const
Definition UniquePtr.h:752
UE_FORCEINLINE_HINT bool operator==(TYPE_OF_NULLPTR) const
Definition UniquePtr.h:838
TUniquePtr & operator=(TYPE_OF_NULLPTR)
Definition UniquePtr.h:642
UE_FORCEINLINE_HINT T & operator[](SIZE_T Index) const
Definition UniquePtr.h:685
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:695
UE_FORCEINLINE_HINT bool operator!=(TYPE_OF_NULLPTR) const
Definition UniquePtr.h:865
constexpr TUniquePtr(TYPE_OF_NULLPTR)
Definition UniquePtr.h:568
TUniquePtr(U *InPtr)
Definition UniquePtr.h:529
UE_FORCEINLINE_HINT Deleter & GetDeleter()
Definition UniquePtr.h:742
UE_FORCEINLINE_HINT ~TUniquePtr()
Definition UniquePtr.h:655
UE_FORCEINLINE_HINT bool operator==(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:770
void Reset(TYPE_OF_NULLPTR InPtr=nullptr)
Definition UniquePtr.h:729
TUniquePtr(U *InPtr, Deleter &&InDeleter)
Definition UniquePtr.h:544
UE_FORCEINLINE_HINT bool operator<=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:812
TUniquePtr(TUniquePtr< OtherT, OtherDeleter > &&Other)
Definition UniquePtr.h:592
constexpr TUniquePtr()
Definition UniquePtr.h:514
TUniquePtr & operator=(const TUniquePtr &)=delete
void Reset(U *InPtr)
Definition UniquePtr.h:721
friend uint32 GetTypeHash(const TUniquePtr &UniquePtr)
Definition UniquePtr.h:871
UE_FORCEINLINE_HINT bool operator>=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:826
UE_FORCEINLINE_HINT bool operator<(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:784
TUniquePtr & operator=(TUniquePtr &&Other)
Definition UniquePtr.h:602
TUniquePtr(TUniquePtr &&Other)
Definition UniquePtr.h:577
TUniquePtr & operator=(TUniquePtr< OtherT, OtherDeleter > &&Other)
Definition UniquePtr.h:626
T ElementType
Definition UniquePtr.h:505
Definition UniquePtr.h:107
TUniquePtr & operator=(TUniquePtr &&Other)
Definition UniquePtr.h:214
UE_FORCEINLINE_HINT bool operator<(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:405
UE_FORCEINLINE_HINT Deleter & GetDeleter()
Definition UniquePtr.h:362
TUniquePtr & operator=(TUniquePtr< OtherT, OtherDeleter > &&Other)
Definition UniquePtr.h:241
UE_FORCEINLINE_HINT bool operator>(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:419
T * Release()
Definition UniquePtr.h:334
UE_FORCEINLINE_HINT bool operator>=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:447
void Reset(T *InPtr=nullptr)
Definition UniquePtr.h:346
UE_FORCEINLINE_HINT bool operator==(TYPE_OF_NULLPTR) const
Definition UniquePtr.h:459
bool IsValid() const
Definition UniquePtr.h:280
TUniquePtr(TUniquePtr< OtherT, OtherDeleter > &&Other)
Definition UniquePtr.h:204
UE_FORCEINLINE_HINT ~TUniquePtr()
Definition UniquePtr.h:270
UE_FORCEINLINE_HINT const Deleter & GetDeleter() const
Definition UniquePtr.h:372
UE_FORCEINLINE_HINT T * operator->() const
Definition UniquePtr.h:300
UE_FORCEINLINE_HINT bool operator==(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:391
UE_FORCEINLINE_HINT DummyT & operator*() const
Definition UniquePtr.h:314
TUniquePtr(U *InPtr, const Deleter &InDeleter)
Definition UniquePtr.h:168
TUniquePtr & operator=(const TUniquePtr &)=delete
UE_FORCEINLINE_HINT bool operator!=(TYPE_OF_NULLPTR) const
Definition UniquePtr.h:486
T ElementType
Definition UniquePtr.h:114
TUniquePtr & operator=(TYPE_OF_NULLPTR)
Definition UniquePtr.h:257
UE_FORCEINLINE_HINT bool operator!=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:474
TUniquePtr(const TUniquePtr &)=delete
friend uint32 GetTypeHash(const TUniquePtr &UniquePtr)
Definition UniquePtr.h:492
TUniquePtr(U *InPtr)
Definition UniquePtr.h:138
TUniquePtr(TUniquePtr &&Other)
Definition UniquePtr.h:186
constexpr TUniquePtr()
Definition UniquePtr.h:123
TUniquePtr(TYPE_OF_NULLPTR)
Definition UniquePtr.h:177
UE_FORCEINLINE_HINT bool operator<=(const TUniquePtr< RhsT > &Rhs) const
Definition UniquePtr.h:433
TUniquePtr(U *InPtr, Deleter &&InDeleter)
Definition UniquePtr.h:153
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
U16 Index
Definition radfft.cpp:71
TDefaultDelete & operator=(const TDefaultDelete &)=default
void operator()(U *Ptr) const
Definition UniquePtr.h:99
TDefaultDelete()=default
TDefaultDelete(const TDefaultDelete &)=default
TDefaultDelete & operator=(const TDefaultDelete< U[]> &)
Definition UniquePtr.h:90
TDefaultDelete(const TDefaultDelete< U[]> &)
Definition UniquePtr.h:82
~TDefaultDelete()=default
Definition UniquePtr.h:28
TDefaultDelete(const TDefaultDelete< U > &)
Definition UniquePtr.h:40
TDefaultDelete()=default
TDefaultDelete & operator=(const TDefaultDelete< U > &)
Definition UniquePtr.h:48
TDefaultDelete(const TDefaultDelete &)=default
void operator()(T *Ptr) const
Definition UniquePtr.h:53
~TDefaultDelete()=default
TDefaultDelete & operator=(const TDefaultDelete &)=default
DECLARE_INLINE_TYPE_LAYOUT(TDefaultDelete, NonVirtual)
Definition UnrealTypeTraits.h:410
Definition IsArray.h:17
Definition IsArray.h:23
Definition UnrealTypeTraits.h:172