Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

optional<bool>(optional<bool>) constructor is broken in 1.91 #1143

Copy link
Copy link

Description

@eltoder
Issue body actions

It appears that changes to boost::optional in 1.91 introduced a bug in optional<bool>(optional<bool>) constructor similar to the one from LWG issue 3836. That is, instead of copying the source optional, it converts it to a bool using its operator bool and stores that result in the new optional. This results in an optional that always has a value, which is equal to whether the source optional had a value.

Test case:

#include <optional>
#include <iostream>
#include <boost/optional.hpp>

using WHICH::optional;

template <class T>
std::ostream& print(std::ostream& s, const optional<T>& opt) {
    return opt ? s << *opt : s << "--";
}

int main() {
    optional<bool> a;
    optional<bool> b(a);
    optional<bool> c(b);
    print(std::cout, a) << " ";
    print(std::cout, b) << " ";
    print(std::cout, c) << std::endl;
    return 0;
}

Compiling with std::optional gives the expected behavior:

$ g++ -DWHICH=std t.cc && ./a.out
-- -- --

Compiling with boost::optional from 1.91 shows the bug:

$ g++ -DWHICH=boost t.cc && ./a.out
-- 0 1

Earlier versions of boost worked the same way as std::optional.

Tested on linux with g++ version 13.3.0.

Reactions are currently unavailable

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    Morty Proxy This is a proxified and sanitized view of the page, visit original site.