A never-valueless implementation of std::variant
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



This repository contains a never-valueless C++11/14/17 implementation of std::variant in variant.hpp and an implementation of expected<T, E...> in expected.hpp that is an extended version of expected<T, E> as proposed in P0323R1 and the subsequent D0323R2.

The code requires Boost.Mp11 and Boost.Config.

The repository is intended to be placed into the libs/variant2 directory of a Boost clone or release, but the header variant.hpp will also work standalone.

Supported compilers:

  • g++ 4.8 or later with -std=c++11 or above
  • clang++ 3.5 or later with -std=c++11 or above
  • Visual Studio 2015, 2017

Tested on Travis and Appveyor.


The class boost::variant2::variant<T...> is an almost conforming implementation of std::variant with the following differences:

  • A converting constructor from, e.g. variant<int, float> to variant<float, double, int> is provided as an extension;
  • The reverse operation, going from variant<float, double, int> to variant<int, float> is provided as the member function subset<U...>. (This operation can throw if the current state of the variant cannot be represented.)
  • variant<T...> is not trivial when all contained types are trivial.

To avoid going into a valueless-by-exception state, this implementation falls back to using double storage unless

  • one of the alternatives is the type monostate,
  • one of the alternatives has a nonthrowing default constructor, or
  • all the contained types are nothrow move constructible.

If the first two bullets don't hold, but the third does, the variant uses single storage, but emplace constructs a temporary and moves it into place if the construction of the object can throw. In case this is undesirable, one can force emplace into always constructing in-place by adding monostate as one of the alternatives.


The class boost::variant2::expected<T, E...> represents the return type of an operation that may potentially fail. It contains either the expected result of type T, or a reason for the failure, of one of the error types in E.... Internally, this is stored as variant<T, E...>.

See its documentation for more information.

Note that, while variant is production quality, expected is still a work in progress and has no test suite yet.