diff --git a/README.md b/README.md index d47ac80..8bb9f94 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,64 @@ # variant2 -This repository contains a never-valueless C++14 implementation of [std::variant](http://en.cppreference.com/w/cpp/utility/variant) in [variant.hpp](include/boost/variant2/variant.hpp) and an implementation of `expected` in [expected.hpp](include/boost/variant2/expected.hpp) that is an extended version of `expected` as proposed in [P0323R1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0323r1.pdf) and the subsequent [D0323R2](https://github.com/viboes/std-make/blob/master/doc/proposal/expected/d0323r2.md). +This repository contains a never-valueless C++11/14/17 implementation of +[std::variant](http://en.cppreference.com/w/cpp/utility/variant) in +[variant.hpp](include/boost/variant2/variant.hpp) and an implementation of +`expected` in [expected.hpp](include/boost/variant2/expected.hpp) +that is an extended version of `expected` as proposed in +[P0323R1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0323r1.pdf) +and the subsequent +[D0323R2](https://github.com/viboes/std-make/blob/master/doc/proposal/expected/d0323r2.md). -The code requires [mp11](https://github.com/pdimov/mp11) and Boost.Config. The repository is intended to be placed into the `libs/variant2` directory of a Boost clone or release, with mp11 in `libs/mp11`, but the headers will also work standalone if [mp11.hpp](https://github.com/pdimov/mp11/blob/master/include/boost/mp11.hpp) or [mp11_single.hpp](https://github.com/pdimov/mp11/blob/master/include/boost/mp11_single.hpp) is included beforehand. +The code requires [Boost.Mp11](https://github.com/boostorg/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](https://godbolt.org/z/6LSV3Z). Supported compilers: -* g++ 5 or later with -std=c++14 or -std=c++1z -* clang++ 3.5 or later with -std=c++14 or -std=c++1z -* Visual Studio 2017 +* 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](https://travis-ci.org/pdimov/variant2/) and [Appveyor](https://ci.appveyor.com/project/pdimov/variant2/). +Tested on [Travis](https://travis-ci.org/pdimov/variant2/) and +[Appveyor](https://ci.appveyor.com/project/pdimov/variant2/). ## variant.hpp -The class `boost::variant2::variant` is an almost conforming implementation of `std::variant` with the following differences: +The class `boost::variant2::variant` is an almost conforming +implementation of `std::variant` with the following differences: -* A converting constructor from, e.g. `variant` to `variant` is provided as an extension; -* The reverse operation, going from `variant` to `variant` is provided as the member function `subset`. (This operation can throw if the current state of the variant cannot be represented.) +* A converting constructor from, e.g. `variant` to + `variant` is provided as an extension; +* The reverse operation, going from `variant` to + `variant` is provided as the member function `subset`. + (This operation can throw if the current state of the variant cannot be + represented.) +* `variant` 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 +To avoid going into a valueless-by-exception state, this implementation falls +back to using double storage unless -* all the contained types are nothrow move constructible, or -* the first alternative is the type `valueless`. +* one of the alternatives is the type `monostate`, +* one of the alterantives has a nonthtowing default constructor, or +* all the contained types are nothrow move constructible. -If the second bullet doesn't hold, but the first 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 `valueless` as a first alternative. +If the first two bullets doesn'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. ## expected.hpp -The class `boost::variant2::expected` 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`. +The class `boost::variant2::expected` 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`. See [its documentation](doc/expected.md) for more information. +Note that, while `variant` is production quality, `expected` is still a work +in progress and has no test suite yet.