https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86970

ensadc at mailnesia dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ensadc at mailnesia dot com

--- Comment #1 from ensadc at mailnesia dot com ---
Removed `#include`:

----
template<typename T>
struct faketuple
{
    template<typename U>
    constexpr faketuple(U&& u) { }

    constexpr faketuple(const faketuple&) = default;
};

namespace ns {
    template <typename A>
    class Foo : private A
    {
    public:
        template <typename FA>
        explicit constexpr Foo(FA&& a)
            : A{static_cast<FA&&>(a)}
        {}
    };

    template <typename A>
    Foo(A)->Foo<A>;

    template <typename T>
    constexpr auto frobnicate(T&& val)
    {
        return [val = static_cast<T&&>(val)] {};
    }

    template <typename A, typename B>
    class Bar
    {
        A a;
        faketuple<B> b;

    public:
        template <typename FA, typename FB>
        explicit constexpr Bar(FA&& a, FB&& b)
            : a{a}
            , b{b}
        {}
    };

    template <typename A, typename B>
    Bar(A, B)->Bar<A, B>;

    constexpr auto Baz = ns::Foo{ns::frobnicate(ns::Bar{[] {}, [](int) {}})};
}

----
But `std::tuple` has a move constructor, unlike `faketuple` :/

Reply via email to