martinmoene/expected-lite

Compilation failed with only moveable type or only copyable type

cbegue opened this issue · 12 comments

Hi,

First of all thanks for this great library

I can't use nonstd::expected with a non copyable type or a non moveable type can you tell me if this behavior is expected ?

You can find my test code and the compilation error here https://godbolt.org/z/o2Evdr (with gcc-9.2 and clang-8)

Thank you in advance for your answer

Hello!

Same problem here. What is the motivation behind this design?

I've applied the following patch to my local copy to make it work with non-copyable or non-movable types.

allow-non-copyable-and-non-movable.patch

Likeky related to issue #29

Thanks for your patches I will test your modifications soon and give you a feedback.

According to this issue: jinja2cpp/Jinja2Cpp#157
For now, nonstd::expected_lite has got no copy-constructor:

home/travis/build/jinja2cpp/examples-build/thirdparty/Jinja2Cpp/src/statements.cpp:426:6:   required from here
/home/travis/build/jinja2cpp/examples-build/thirdparty/variant-lite/include/nonstd/variant.hpp:1915:17: error: use of deleted function ‘nonstd::expected_lite::expected<std::shared_ptr<jinja2::TemplateImpl<char> >, jinja2::ErrorInfoTpl<char> >::expected(const nonstd::expected_lite::expected<std::shared_ptr<jinja2::TemplateImpl<char> >, jinja2::ErrorInfoTpl<char> >&)’
         return v(arg);

But current wording of p0323 requires the explicit copy-ctor:

constexpr expected(const expected&);
    constexpr expected(expected&&) noexcept(see below);
    template<class U, class G>
        explicit(see below) constexpr expected(const expected<U, G>&);
    template<class U, class G>
        explicit(see below) constexpr expected(expected<U, G>&&);

Looks like the proper solution for this issue is to keep the previous version of copy-ctor (before the patch) and add extra template<class U, class G> explicit(see below) constexpr expected(const expected<U, G>& rhs); ctor with the corresponding requirements.

The possible solution looks like this: https://godbolt.org/z/sbB4PL

I. e. move moveable/copyable traits handling to the storage_t class via additional template params and partial specialization. In this case expected_t will inherit this traits automatically.

The problem with the current implementation is perfectly described here: https://stackoverflow.com/questions/27073082/conditionally-disabling-a-copy-constructor
(in the question)

Thanks @flexferrum for the help & pointers. Will look at it later.

Would it be possible to get a 0.3.1 release with these changes? its much easier than tracking patches.

@prince-chrismc I'll release current state as version 0.4.0, hopefully by tomorrow.

Wow thanks! It's greatly appreciated! Absolutely love this project ❤️