diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/almalloc.h | 7 | ||||
-rw-r--r-- | common/aloptional.h | 4 |
2 files changed, 8 insertions, 3 deletions
diff --git a/common/almalloc.h b/common/almalloc.h index e0847eb1..df24c4a9 100644 --- a/common/almalloc.h +++ b/common/almalloc.h @@ -104,6 +104,11 @@ bool operator!=(const allocator<T,N>&, const allocator<U,M>&) noexcept { return template<size_t alignment, typename T> [[gnu::assume_aligned(alignment)]] inline T* assume_aligned(T *ptr) noexcept { return ptr; } + +template<typename T, typename ...Args> +constexpr T* construct_at(T *ptr, Args&&...args) noexcept(noexcept(T{std::forward<Args>(args)...})) +{ return ::new(static_cast<void*>(ptr)) T{std::forward<Args>(args)...}; } + /* At least VS 2015 complains that 'ptr' is unused when the given type's * destructor is trivial (a no-op). So disable that warning for this call. */ @@ -250,7 +255,7 @@ struct FlexArray { static std::unique_ptr<FlexArray> Create(index_type count) { void *ptr{al_calloc(alignof(FlexArray), Sizeof(count))}; - return std::unique_ptr<FlexArray>{new(ptr) FlexArray{count}}; + return std::unique_ptr<FlexArray>{al::construct_at(static_cast<FlexArray*>(ptr), count)}; } FlexArray(index_type size) : mStore{size} { } diff --git a/common/aloptional.h b/common/aloptional.h index a8ca18ba..0eafd4d1 100644 --- a/common/aloptional.h +++ b/common/aloptional.h @@ -58,9 +58,9 @@ class optional { storage_t mStore; template<typename... Args> - void doConstruct(Args&& ...args) + void doConstruct(Args&& ...args) noexcept(noexcept(al::construct_at(std::declval<T*>(), std::forward<Args>(args)...))) { - ::new(std::addressof(mStore.mValue)) T{std::forward<Args>(args)...}; + al::construct_at(std::addressof(mStore.mValue), std::forward<Args>(args)...); mStore.mHasValue = true; } |