Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
cbegue opened this issue Sep 4, 2019 · 12 comments
Open

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

cbegue opened this issue Sep 4, 2019 · 12 comments

Comments

@cbegue
Copy link

cbegue commented Sep 4, 2019

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
Copy link

Hello!

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

@Innokentiy-Alaytsev
Copy link

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
Copy link
Owner

Likeky related to issue #29

@cbegue
Copy link
Author

cbegue commented Sep 16, 2019

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

@flexferrum
Copy link

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.

@flexferrum
Copy link

flexferrum commented Oct 7, 2019

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
Copy link

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

@martinmoene
Copy link
Owner

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

@prince-chrismc
Copy link

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

@martinmoene
Copy link
Owner

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

@prince-chrismc
Copy link

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

@martinmoene
Copy link
Owner

@prince-chrismc released version 0.4.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants