You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[BUG]: std::move_constructible and pybind11::detail::is_move_constructible differ #5983
What version (or hash if on master) of pybind11 are you using?
3.0.1
Problem description
I'm not sure this is a bug.
Must std::move_constructible concept and pybind11::is_move_constructible evaluate the same?
When a struct has a value_type member typedef set to void the two predicates differ (cf. code below).
I stumbled into this problem using CGAL (cf. CGAL/cgal#9319).
Reproducible example code
#include <concepts>
#include <pybind11/pybind11.h>
struct A {
typedef int value_type;
};
static_assert(std::move_constructible<A>); // OK
static_assert(pybind11::detail::is_move_constructible<A>::value); // OK
struct B {
typedef void value_type;
};
static_assert(std::move_constructible<B>); // OK
static_assert(pybind11::detail::is_move_constructible<B>::value); // fails
Is this a regression? Put the last known working version here if it is.
"- The newly added pybind11::detail::is_move_constructible trait can be
specialized for cases in which std::is_move_constructible does not
work as needed. This is very similar to the long-established pybind11::detail::is_copy_constructible. #4631"
So no, they explicitly don't evaluate the same. The question is should they in the case you described
Activity
Skylion007 commentedon Mar 8, 2026
"- The newly added
pybind11::detail::is_move_constructibletrait can bespecialized for cases in which
std::is_move_constructibledoes notwork as needed. This is very similar to the long-established
pybind11::detail::is_copy_constructible.#4631"
So no, they explicitly don't evaluate the same. The question is should they in the case you described