File tree 2 files changed +14
-4
lines changed
2 files changed +14
-4
lines changed Original file line number Diff line number Diff line change @@ -1367,6 +1367,12 @@ template <typename... Ts> class type_caster<std::tuple<Ts...>>
1367
1367
template <typename T>
1368
1368
struct holder_helper {
1369
1369
static auto get (const T &p) -> decltype(p.get()) { return p.get (); }
1370
+
1371
+ // Specialize move-only holder semantics to address #1138.
1372
+ template <typename U = T>
1373
+ static auto get (T &&p, enable_if_t <!is_copy_constructible<U>::value>* = nullptr ) -> decltype(p.get()) {
1374
+ return p.release ();
1375
+ }
1370
1376
};
1371
1377
1372
1378
// / Type caster for holder types like std::shared_ptr, etc.
@@ -1456,8 +1462,11 @@ struct move_only_holder_caster {
1456
1462
" Holder classes are only supported for custom types" );
1457
1463
1458
1464
static handle cast (holder_type &&src, return_value_policy, handle) {
1459
- auto *ptr = holder_helper<holder_type>::get (src);
1460
- return type_caster_base<type>::cast_holder (ptr, &src);
1465
+ // Move `src` so that `holder_helper<>::get()` can call `release` if need be.
1466
+ // That way, if we mix `holder_type`s, we don't have to worry about `existing_holder`
1467
+ // from being mistakenly reinterpret_cast'd to `shared_ptr<type>` (#1138).
1468
+ auto *ptr = holder_helper<holder_type>::get (std::move (src));
1469
+ return type_caster_base<type>::cast_holder (ptr, nullptr );
1461
1470
}
1462
1471
static constexpr auto name = type_caster_base<type>::name;
1463
1472
};
Original file line number Diff line number Diff line change @@ -40,7 +40,8 @@ template <typename T> class huge_unique_ptr {
40
40
uint64_t padding[10 ];
41
41
public:
42
42
huge_unique_ptr (T *p) : ptr(p) {};
43
- T *get () { return ptr.get (); }
43
+ T *get () const { return ptr.get (); }
44
+ T* release () { return ptr.release (); }
44
45
};
45
46
PYBIND11_DECLARE_HOLDER_TYPE (T, huge_unique_ptr<T>);
46
47
@@ -51,7 +52,7 @@ class custom_unique_ptr {
51
52
public:
52
53
custom_unique_ptr (T* p) : impl(p) { }
53
54
T* get () const { return impl.get (); }
54
- T* release_ptr () { return impl.release (); }
55
+ T* release () { return impl.release (); }
55
56
};
56
57
PYBIND11_DECLARE_HOLDER_TYPE (T, custom_unique_ptr<T>);
57
58
You can’t perform that action at this time.
0 commit comments