diff --git a/src/entt/entity/storage.hpp b/src/entt/entity/storage.hpp index 9eb59affc..5f2bc6a32 100644 --- a/src/entt/entity/storage.hpp +++ b/src/entt/entity/storage.hpp @@ -247,7 +247,7 @@ class basic_storage: public basic_sparse_set - void construct(typename alloc_traits::pointer ptr, Args &&...args) { - if constexpr(std::is_aggregate_v) { - alloc_traits::construct(packed.second(), to_address(ptr), Type{std::forward(args)...}); - } else { - alloc_traits::construct(packed.second(), to_address(ptr), std::forward(args)...); - } - } - template void consume_range(It first, It last, Generator generator) { for(const auto sz = base_type::size(); first != last && base_type::slot() != sz; ++first) { @@ -326,7 +317,7 @@ private: void move_element(const std::size_t from, const std::size_t to) final { auto &elem = element_at(from); - construct(assure_at_least(to), std::move(elem)); + alloc_traits::construct(packed.second(), to_address(assure_at_least(to)), std::move(elem)); std::destroy_at(std::addressof(elem)); } @@ -658,8 +649,13 @@ public: template value_type &emplace(const entity_type entt, Args &&...args) { const auto pos = base_type::slot(); - auto *elem = assure_at_least(pos); - construct(elem, std::forward(args)...); + auto elem = assure_at_least(pos); + + if constexpr(std::is_aggregate_v) { + alloc_traits::construct(packed.second(), to_address(elem), Type{std::forward(args)...}); + } else { + alloc_traits::construct(packed.second(), to_address(elem), std::forward(args)...); + } ENTT_TRY { base_type::try_emplace(entt);