Document that a derived archive must call init() itself#357
Merged
Conversation
Since Boost 1.73, the CRTP base archive classes no longer call `init()` from their constructors: doing so downcast this to the most derived class while it was still being constructed, which is undefined behavior and tripped the sanitizers. The derivation guide still showed the old pattern, in which a class derived from one of the `xxx_oarchive_impl` templates relied on the base to write the archive header. Following it now yields an archive that never writes its header. The guide now states that the most derived class is responsible for calling `init()` in its own constructor body, honoring `no_header`, and shows how, noting that the log_archive example is empty only because it suppresses the header. This also corrects the curiously recurring template argument in the further-derivation sketch, which named `xml_oarchive` instead of `log_archive`. Refs issue #182.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Since Boost 1.73, the CRTP base archive classes no longer call
init()from their constructors: doing so downcast this to the most derived class while it was still being constructed, which is undefined behavior and tripped the sanitizers. The derivation guide still showed the old pattern, in which a class derived from one of thexxx_oarchive_impltemplates relied on the base to write the archive header. Following it now yields an archive that never writes its header.The guide now states that the most derived class is responsible for calling
init()in its own constructor body, honoringno_header, and shows how, noting that the log_archive example is empty only because it suppresses the header.This also corrects the curiously recurring template argument in the further-derivation sketch, which named
xml_oarchiveinstead oflog_archive.Refs issue #182.