@@ -803,20 +803,20 @@ auto make_observable(Args&&... args) {
803803
804804 using observer_policy = typename Policy::observer_policy;
805805 using control_block_type = basic_control_block<observer_policy>;
806- using decayed_type = std::decay_t <T>;
806+ using object_type = std::remove_cv_t <T>;
807807 using queries = policy_queries<Policy>;
808808
809809 if constexpr (!queries::make_observer_single_allocation ()) {
810810 if constexpr (
811- has_enable_observer_from_this<T , Policy> &&
811+ has_enable_observer_from_this<object_type , Policy> &&
812812 queries::eoft_base_constructor_needs_block ()) {
813813 // Allocate control block first
814814 control_block_type* block = new control_block_type;
815815
816816 // Allocate object
817- decayed_type * ptr = nullptr ;
817+ object_type * ptr = nullptr ;
818818 try {
819- ptr = new T (*block, std::forward<Args>(args)...);
819+ ptr = new object_type (*block, std::forward<Args>(args)...);
820820 } catch (...) {
821821 delete block;
822822 throw ;
@@ -825,36 +825,38 @@ auto make_observable(Args&&... args) {
825825 return basic_observable_ptr<T, default_delete, Policy>(block, ptr);
826826 } else {
827827 return basic_observable_ptr<T, default_delete, Policy>(
828- new T (std::forward<Args>(args)...));
828+ new object_type (std::forward<Args>(args)...));
829829 }
830830 } else {
831831 // Pre-allocate memory
832832 constexpr std::size_t block_size = sizeof (control_block_type);
833- constexpr std::size_t object_size = sizeof (T);
834- std::byte* buffer = reinterpret_cast <std::byte*>(operator new (block_size + object_size));
833+ constexpr std::size_t object_size = sizeof (object_type);
834+ constexpr std::size_t obj_offset = block_size;
835+
836+ std::byte* buffer = reinterpret_cast <std::byte*>(operator new (obj_offset + object_size));
835837
836838 try {
837839 // Construct control block first
838840 static_assert (!queries::eoft_constructor_allocates (), " library bug" );
839841 control_block_type* block = new (buffer) control_block_type;
840842
841843 // Construct object
842- decayed_type * ptr = nullptr ;
844+ object_type * ptr = nullptr ;
843845 if constexpr (
844- has_enable_observer_from_this<T , Policy> &&
846+ has_enable_observer_from_this<object_type , Policy> &&
845847 queries::eoft_base_constructor_needs_block ()) {
846848 // The object has a constructor that can take a control block; just give it
847- ptr = new (buffer + block_size) decayed_type (*block, std::forward<Args>(args)...);
849+ ptr = new (buffer + obj_offset) object_type (*block, std::forward<Args>(args)...);
848850
849851 // Make owner pointer
850852 return basic_observable_ptr<T, placement_delete, Policy>(block, ptr);
851853 } else {
852- ptr = new (buffer + block_size) decayed_type (std::forward<Args>(args)...);
854+ ptr = new (buffer + obj_offset) object_type (std::forward<Args>(args)...);
853855
854856 // Make owner pointer
855857 auto sptr = basic_observable_ptr<T, placement_delete, Policy>(block, ptr);
856858
857- if constexpr (has_enable_observer_from_this<T , Policy>) {
859+ if constexpr (has_enable_observer_from_this<object_type , Policy>) {
858860 // Notify basic_enable_observer_from_this of the control
859861 ptr->set_control_block_ (block);
860862 }
0 commit comments