expected-lite icon indicating copy to clipboard operation
expected-lite copied to clipboard

Compilation failed with only moveable type or only copyable type

Open cbegue opened this issue 4 years ago • 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

cbegue avatar Sep 04 '19 13:09 cbegue

Hello!

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

Innokentiy-Alaytsev avatar Sep 13 '19 13:09 Innokentiy-Alaytsev

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

Innokentiy-Alaytsev avatar Sep 13 '19 14:09 Innokentiy-Alaytsev

Likeky related to issue #29

martinmoene avatar Sep 14 '19 09:09 martinmoene

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

cbegue avatar Sep 16 '19 09:09 cbegue

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 avatar Oct 07 '19 21:10 flexferrum

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 avatar Oct 07 '19 22:10 flexferrum

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

flexferrum avatar Oct 08 '19 08:10 flexferrum

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

martinmoene avatar Oct 08 '19 08:10 martinmoene

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

prince-chrismc avatar Apr 24 '20 15:04 prince-chrismc

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

martinmoene avatar Apr 24 '20 15:04 martinmoene

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

prince-chrismc avatar Apr 24 '20 16:04 prince-chrismc

@prince-chrismc released version 0.4.0

martinmoene avatar Apr 24 '20 17:04 martinmoene