martinmoene / expected-lite

expected lite - Expected objects in C++11 and later in a single-file header-only library
Boost Software License 1.0
375 stars 34 forks source link

Compilation failed with only moveable type or only copyable type #32

Open cbegue opened 5 years ago

cbegue commented 5 years ago

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

Innokentiy-Alaytsev commented 5 years ago

Hello!

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

Innokentiy-Alaytsev commented 5 years ago

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

martinmoene commented 5 years ago

Likeky related to issue #29

cbegue commented 5 years ago

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

flexferrum commented 4 years ago

According to this issue: https://github.com/jinja2cpp/Jinja2Cpp/issues/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.

flexferrum commented 4 years ago

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.

flexferrum commented 4 years ago

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

martinmoene commented 4 years ago

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

prince-chrismc commented 4 years ago

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

martinmoene commented 4 years ago

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

prince-chrismc commented 4 years ago

Wow thanks! It's greatly appreciated! Absolutely love this project :heart:

martinmoene commented 4 years ago

@prince-chrismc released version 0.4.0