@@ -98,6 +98,16 @@ class MyObject3 : public std::enable_shared_from_this<MyObject3> {
9898 int value;
9999};
100100
101+ // an uncopyable object managed by a std::shared_ptr<>
102+ class MyObject3a {
103+ public:
104+ MyObject3a (int value) : value(value) { print_created (this , toString ()); }
105+ std::string toString () const { return " MyObject3a[" + std::to_string (value) + " ]" ; }
106+ virtual ~MyObject3a () { print_destroyed (this ); }
107+ private:
108+ int value;
109+ };
110+
101111// test_unique_nodelete
102112// Object with a private destructor
103113class MyObject4 ;
@@ -353,6 +363,15 @@ TEST_SUBMODULE(smart_ptr, m) {
353363 m.def (" print_myobject3_3" , [](const std::shared_ptr<MyObject3> &obj) { py::print (obj->toString ()); });
354364 m.def (" print_myobject3_4" , [](const std::shared_ptr<MyObject3> *obj) { py::print ((*obj)->toString ()); });
355365
366+ py::class_<MyObject3a>(m, " MyObject3a" );
367+ m.def (" make_myobject3_1" , []() { return new MyObject3a (8 ); });
368+ m.def (" make_myobject3_2" , []() { return std::make_shared<MyObject3a>(9 ); });
369+ m.def (" print_myobject3a_1" , [](const MyObject3a *obj) { py::print (obj->toString ()); });
370+ m.def (" print_myobject3a_2" , [](std::shared_ptr<MyObject3a> obj) { py::print (obj->toString ()); });
371+ m.def (" print_myobject3a_3" , [](const std::shared_ptr<MyObject3a> &obj) { py::print (obj->toString ()); });
372+ // this doesn't compile, should it?
373+ // m.def("print_myobject3a_4", [](const std::shared_ptr<MyObject3a> *obj) { py::print((*obj)->toString()); });
374+
356375 // test_smart_ptr_refcounting
357376 m.def (" test_object1_refcounting" , []() {
358377 ref<MyObject1> o = new MyObject1 (0 );
@@ -462,4 +481,10 @@ TEST_SUBMODULE(smart_ptr, m) {
462481 list.append (py::cast (e));
463482 return list;
464483 });
484+
485+ m.def (" test_3011_shared_ptr" , []() {
486+ auto o = std::make_shared<MyObject3a>(42 );
487+ auto l = py::list ();
488+ l.append (o);
489+ });
465490}
0 commit comments