Removed support for Python 2.7, Python 3.5, and MSVC 2015. Support for MSVC 2017 is limited due to availability of CI runners; we highly recommend MSVC 2019 or 2022 be used. Initial support added for Python 3.11.
New features:
- `py::anyset` & `py::frozenset` were added, with copying (cast) to `std::set` (similar to `set`). [3901](https://github.com/pybind/pybind11/pull/3901)
- Support bytearray casting to string. [3707](https://github.com/pybind/pybind11/pull/3707)
- `type_caster<std::monostate>` was added. `std::monostate` is a tag type that allows `std::variant` to act as an optional, or allows default construction of a `std::variant` holding a non-default constructible type. [3818](https://github.com/pybind/pybind11/pull/3818)
- `pybind11::capsule::set_name` added to mutate the name of the capsule instance. [3866](https://github.com/pybind/pybind11/pull/3866)
- NumPy: dtype constructor from type number added, accessors corresponding to Python API `dtype.num`, `dtype.byteorder`, `dtype.flags` and `dtype.alignment` added. [3868](https://github.com/pybind/pybind11/pull/3868)
Changes:
- Python 3.6 is now the minimum supported version. [3688](https://github.com/pybind/pybind11/pull/3688) [#3719](https://github.com/pybind/pybind11/pull/3719)
- The minimum version for MSVC is now 2017. [3722](https://github.com/pybind/pybind11/pull/3722)
- Fix issues with CPython 3.11 betas and add to supported test matrix. [3923](https://github.com/pybind/pybind11/pull/3923)
- `error_already_set` is now safer and more performant, especially for exceptions with long tracebacks, by delaying computation. [1895](https://github.com/pybind/pybind11/pull/1895)
- Improve exception handling in python `str` bindings. [3826](https://github.com/pybind/pybind11/pull/3826)
- The bindings for capsules now have more consistent exception handling. [3825](https://github.com/pybind/pybind11/pull/3825)
- `PYBIND11_OBJECT_CVT` and `PYBIND11_OBJECT_CVT_DEFAULT` macro can now be used to define classes in namespaces other than pybind11. [3797](https://github.com/pybind/pybind11/pull/3797)
- Error printing code now uses `PYBIND11_DETAILED_ERROR_MESSAGES` instead of requiring `NDEBUG`, allowing use with release builds if desired. [3913](https://github.com/pybind/pybind11/pull/3913)
- Implicit conversion of the literal `0` to `pybind11::handle` is now disabled. [4008](https://github.com/pybind/pybind11/pull/4008)
Bug fixes:
- Fix exception handling when `pybind11::weakref()` fails. [3739](https://github.com/pybind/pybind11/pull/3739)
- `module_::def_submodule` was missing proper error handling. This is fixed now. [3973](https://github.com/pybind/pybind11/pull/3973)
- The behavior or `error_already_set` was made safer and the highly opaque "Unknown internal error occurred" message was replaced with a more helpful message. [3982](https://github.com/pybind/pybind11/pull/3982)
- `error_already_set::what()` now handles non-normalized exceptions correctly. [3971](https://github.com/pybind/pybind11/pull/3971)
- Support older C++ compilers where filesystem is not yet part of the standard library and is instead included in `std::experimental::filesystem`. [3840](https://github.com/pybind/pybind11/pull/3840)
- Fix `-Wfree-nonheap-object` warnings produced by GCC by avoiding returning pointers to static objects with `return_value_policy::take_ownership`. [3946](https://github.com/pybind/pybind11/pull/3946)
- Fix cast from pytype rvalue to another pytype. [3949](https://github.com/pybind/pybind11/pull/3949)
- Ensure proper behavior when garbage collecting classes with dynamic attributes in Python \>=3.9. [4051](https://github.com/pybind/pybind11/pull/4051)
- A couple long-standing `PYBIND11_NAMESPACE` `__attribute__((visibility("hidden")))` inconsistencies are now fixed (affects only unusual environments). [4043](https://github.com/pybind/pybind11/pull/4043)
- `pybind11::detail::get_internals()` is now resilient to in-flight Python exceptions. [3981](https://github.com/pybind/pybind11/pull/3981)
- Arrays with a dimension of size 0 are now properly converted to dynamic Eigen matrices (more common in NumPy 1.23). [4038](https://github.com/pybind/pybind11/pull/4038)
- Avoid catching unrelated errors when importing NumPy. [3974](https://github.com/pybind/pybind11/pull/3974)
Performance and style:
- Added an accessor overload of `(object &&key)` to reference steal the object when using python types as keys. This prevents unnecessary reference count overhead for attr, dictionary, tuple, and sequence look ups. Added additional regression tests. Fixed a performance bug the caused accessor assignments to potentially perform unnecessary copies. [3970](https://github.com/pybind/pybind11/pull/3970)
- Perfect forward all args of `make_iterator`. [3980](https://github.com/pybind/pybind11/pull/3980)
- Avoid potential bug in pycapsule destructor by adding an `error_guard` to one of the dtors. [3958](https://github.com/pybind/pybind11/pull/3958)
- Optimize dictionary access in `strip_padding` for numpy. [3994](https://github.com/pybind/pybind11/pull/3994)
- `stl_bind.h` bindings now take slice args as a const-ref. [3852](https://github.com/pybind/pybind11/pull/3852)
- Made slice constructor more consistent, and improve performance of some casters by allowing reference stealing. [3845](https://github.com/pybind/pybind11/pull/3845)
- Change numpy dtype from_args method to use const ref. [3878](https://github.com/pybind/pybind11/pull/3878)
- Follow rule of three to ensure `PyErr_Restore` is called only once. [3872](https://github.com/pybind/pybind11/pull/3872)
- Added missing perfect forwarding for `make_iterator` functions. [3860](https://github.com/pybind/pybind11/pull/3860)
- Optimize c++ to python function casting by using the rvalue caster. [3966](https://github.com/pybind/pybind11/pull/3966)
- Optimize Eigen sparse matrix casting by removing unnecessary temporary. [4064](https://github.com/pybind/pybind11/pull/4064)
- Avoid potential implicit copy/assignment constructors causing double free in `strdup_gaurd`. [3905](https://github.com/pybind/pybind11/pull/3905)
- Enable clang-tidy checks `misc-definitions-in-headers`, `modernize-loop-convert`, and `modernize-use-nullptr`. [3881](https://github.com/pybind/pybind11/pull/3881) [#3988](https://github.com/pybind/pybind11/pull/3988)
Build system improvements:
- CMake: Fix file extension on Windows with cp36 and cp37 using FindPython. [3919](https://github.com/pybind/pybind11/pull/3919)
- CMake: Support multiple Python targets (such as on vcpkg). [3948](https://github.com/pybind/pybind11/pull/3948)
- CMake: Fix issue with NVCC on Windows. [3947](https://github.com/pybind/pybind11/pull/3947)
- CMake: Drop the bitness check on cross compiles (like targeting WebAssembly via Emscripten). [3959](https://github.com/pybind/pybind11/pull/3959)
- Add MSVC builds in debug mode to CI. [3784](https://github.com/pybind/pybind11/pull/3784)
- MSVC 2022 C++20 coverage was added to GitHub Actions, including Eigen. [3732](https://github.com/pybind/pybind11/pull/3732), [#3741](https://github.com/pybind/pybind11/pull/3741)
Backend and tidying up:
- New theme for the documentation. [3109](https://github.com/pybind/pybind11/pull/3109)
- Remove idioms in code comments. Use more inclusive language. [3809](https://github.com/pybind/pybind11/pull/3809)
- `include <iostream>` was removed from the `pybind11/stl.h` header. Your project may break if it has a transitive dependency on this include. The fix is to "Include What You Use". [3928](https://github.com/pybind/pybind11/pull/3928)
- Avoid `setup.py <command>` usage in internal tests. [3734](https://github.com/pybind/pybind11/pull/3734)