What's new in 1.93.0.beta1

The summary is being generated, please check back later.

Release notes version 1.93.0.beta1

Version 1.93.0

New Libraries

Updated Libraries

  • Bimap:

    • Added std::initializer_list constructor (PR#31).

    • Following standard library conventions since C++11, all modifier functions taking iterator arguments now accept const_iterator arguments instead (PR#56).

  • DynamicBitset:

    • Added extract( pos, len ), which returns the bits in a range as a new bitset, as std::basic_string::substr() does for strings.

    • Made the constructor from a size and a value take the value as an unsigned long long, as std::bitset does (where unsigned long has 32 bits, the result changes for wider values), and made it non-explicit, adding an explicit constructor from a size alone.

    • Added the allocator-extended copy and move constructors, and a constructor from a size and an allocator, to support uses-allocator construction (e.g. in std::pmr containers).

    • Made the string constructors and to_string() independent of the global locale, which fixes them for char8_t, char16_t and char32_t, and made the constructor from a const CharT * accept only character types and read at most n characters.

    • Made the constructor from a range of blocks take two unscoped enumerators as a size and a value, and the functions which take a range of blocks accept a value_type which converts implicitly to Block, other than bool and the floating-point types.

    • Improved the iterators: they are default-constructible, iterator converts to const_iterator, their difference type is std::intmax_t, and the std::ranges algorithms, std::sort() and std::reverse() work on a dynamic_bitset. Also added the member types value_type and difference_type.

    • Declared noexcept the functions which have no precondition and can’t throw, and the move operations when those of the underlying container are (#85).

    • In C++20, made to_string(), the string constructors and the find_*() functions usable in constant expressions, and documented the constexpr support.

    • Fixed several issues with user-supplied containers and allocators (e.g. std::deque and std::pmr::polymorphic_allocator), and documented the requirements on a container.

    • Made append() of a range of blocks give the strong exception guarantee, and made a moved-from bitset, and one whose copy or move assignment throws, always empty.

    • Made loading from a Boost.Serialization archive check the data, and throw std::invalid_argument if it is invalid.

    • Fixed link errors with npos and bits_per_block in C++11 and C++14, a regression of Boost 1.90.

    • Made faster the bitwise and shift operators, set(), reset() and flip() of a range, the find_*() functions and to_string().

    • Moved undocumented implementation details, such as bit_iterator, out of namespace boost.

  • MSM:

    • The backmp11 back-end is no longer experimental. Its API is considered stable from this release on, after the cleanup listed below.

    • Breaking changes (backmp11):

      • The active state switch policy can no longer be configured; the active state is now always set after source exit, in compliance with the UML specification (#222).

      • The deprecated HANDLED_-prefixed values are removed from the process_result enum, use discarded, consumed, rejected and deferred instead (#242).

    • Fixed a bug in the back11 back-end where a matching transition could be ignored depending on the order of rows in the transition table (#252)

  • PolyCollection:

    • Added unordered, stable collections boost::base_unordered_collection, boost::function_unordered_collection, boost::any_unordered_collection and boost::variant_unordered_collection, internally based on boost::container::hub.

  • Serialization:

    • Fixed CVE-2023-34399: a pointer loaded with a negative class id other than -1 read the class table out of bounds. Every negative id now loads as a null pointer (PR#332).

    • Raised the archive library version to 21, so earlier versions of the library reject text and binary archives written by this one; archives written by earlier versions still load. The change stores at full width the enumerations whose underlying type is wider than int, which used to be truncated (#353).

    • Fixed the termination of the program when an XML input archive is destroyed at the end of its input, e.g. after a failed read, a regression of Boost 1.66 (#82, #99, #109).

    • Deprecated <boost/serialization/std_variant.hpp>, as <boost/serialization/variant.hpp> handles std::variant too, and removed <boost/serialization/variant2.hpp>, which was ill-formed and so could not be used (PR#379).

    • Added support for std::filesystem::path, except with GCC before 9, whose <filesystem> is unreliable (#337).

    • Added BOOST_CLASS_TEMPLATE_VERSION, which sets the version of a class template, as BOOST_CLASS_VERSION does for a class (#179).

    • Made optional<T> serializable when T has no default constructor, or only a private one, by loading its value as a container element is loaded; archives of other optional types are unchanged (#121, #165).

    • Made optional<T> serializable when T is move-only (PR#330).

    • Made the alternatives of a variant load as container elements do, so that they no longer need a public default constructor (#338).

    • Made a std::basic_string with an allocator of its own, such as std::pmr::string, serializable with no declaration, in the same form as std::string (#267).

    • Added move operations to the types defined by BOOST_STRONG_TYPEDEF (#341).

    • Made public the base_type typedef of version_type, class_id_type, object_id_type, collection_size_type, item_version_type, library_version_type and tracking_type, naming the type each of them wraps (#326).

    • Added constructors which take the end of the input to transform_width and remove_whitespace. With them, a base64 decoder no longer reads past the end of an input whose length leaves a remainder of one when divided by four, nor remove_whitespace past one which ends in whitespace (#324, #254).

    • Made archive_exception give the offset at which an input stream error occurred (PR#380).

    • Made infinities and NaNs written to text and XML archives read back. They are now written as inf, -inf and nan with any standard library, and the forms earlier versions wrote load too (#386).

    • Fixed an object saved through a pointer to its base class, across shared libraries, loading with its base part empty, a regression of Boost 1.85 (#329).

    • Fixed silent data loss when the same variant is serialized by value more than once (#203).

    • Made the XML output archive write the closing tag of a complete document even when it is destroyed during stack unwinding (#188).

    • Fixed the loading from XML archives of a std::wstring with characters outside ASCII, which was decoded according to the locale rather than as UTF-8 (#298).

    • Fixed malformed escapes in wide XML archives, and the archive iterators xml_escape, xml_unescape, transform_width and remove_whitespace losing their state when copied (#229).

    • Fixed a leak and double frees in the cleanup after an exception interrupts a load: the object being loaded leaked, and objects an owning smart pointer had taken over were freed again. Note that objects which used to leak are now freed, so a handler which deleted them must stop doing so (#260).

    • Fixed undefined references from a version trait written by hand whose value has no out-of-class definition (#311).

    • Fixed BOOST_SERIALIZATION_FACTORY_1 to BOOST_SERIALIZATION_FACTORY_4, which didn’t compile (#215).

    • Fixed a GCC error when serializing a std::optional with <boost/serialization/shared_ptr.hpp> included (#319).

    • Fixed a link error when a program built with clang-cl uses the library built with MSVC, by no longer deriving the archive exceptions virtually (#321).

    • Fixed a multiply defined symbol error from MSVC when both a DLL and an executable use a wide archive with static linking (#232).

    • Fixed the loss of a type’s registration in every shared library when one of the libraries registering it is unloaded (#325).

    • Silenced a GCC -Wuninitialized warning (#333).

    • Declared C++11 as the minimum standard, which the library had in fact required for some time (PR#367).

    • Replaced the frames of the documentation with ordinary pages (#300).

    • Documented that a derived archive must call init() itself (#182), that the file using BOOST_CLASS_EXPORT_IMPLEMENT must include the archive headers (#327), and that a value written through a polymorphic archive needs a name (#189).

Compilers Tested

Boost’s primary test compilers are:

  • Linux:

    • Clang, C++03: 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++11: 3.4, 11.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++14: 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++17: 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++20: 11.0.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • GCC, C++03: 4.6.3, 11, 12

    • GCC, C++11: 4.7.3, 4.8.5, 11, 12

    • GCC, C++14: 5.4.0, 6.4.0, 7.3.0, 8.0.1, 9.1.0, 11, 12

    • GCC, C++17: 7.3.0, 8.0.1, 9.1.0, 11, 12

    • GCC, C++20: 8.0.1, 9.1.0, 10, 11, 12

  • OS X:

    • Apple Clang, C++03: 11.0.3

    • Apple Clang, C++11: 11.0.3

    • Apple Clang, C++14: 11.0.3

    • Apple Clang, C++17: 11.0.3

    • Apple Clang, C++20: 11.0.3

  • Windows:

    • Visual C++: 10.0, 11.0, 12.0, 14.0, 14.1, 14.2, 14.3

Acknowledgements

Marshall Clow, Glen Fernandes and Ion Gaztañaga managed this release.

Join the Boost Developers Mailing List

Get the latest on releases, features, security patches, fixes and all major announcements.
Want to fix bugs, review code, maintain libraries, and propose new features?
Read our contributors guide and join the Boost community.

Boost is publicly released three times a year in April, August, and December. Each release has updates to existing libraries, and any new libraries that have passed the rigorous acceptance process.

Decorative illustration