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

            Bug ID: 85577
           Summary: list-initialization chooses initializer-list
                    constructor
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

namespace std
{
  typedef long unsigned int size_t;

  template<class _E>
    class initializer_list
    {
    public:
      typedef _E value_type;
      typedef const _E& reference;
      typedef const _E& const_reference;
      typedef size_t size_type;
      typedef const _E* iterator;
      typedef const _E* const_iterator;

    private:
      iterator _M_array;
      size_type _M_len;


      constexpr initializer_list(const_iterator __a, size_type __l)
      : _M_array(__a), _M_len(__l) { }

    public:
      constexpr initializer_list() : _M_array(0), _M_len(0) { }


      constexpr size_type
      size() { return _M_len; }


      constexpr const_iterator
      begin() { return _M_array; }


      constexpr const_iterator
      end() { return begin() + size(); }
  };

  template<typename T> T&& move(T& t) { return static_cast<T&&>(t); }

  template<typename T>
  struct vector {
    vector(vector&&) noexcept { }
    vector(initializer_list<T>) = delete;
  };
}

struct A {
  A(A const&) = delete;
  A& operator=(A const&) = delete;
  A(A&&) = default;
  A& operator=(A&&) = default;
  A(std::vector<A>&& v) : v{std::move(v)} { }

  std::vector<A> v;
};


v.ii: In constructor ‘A::A(std::vector<A>&&)’:
v.ii:54:41: error: use of deleted function
‘std::vector<T>::vector(std::initializer_list<T>) [with T = A]’
   A(std::vector<A>&& v) : v{std::move(v)} { }
                                         ^
v.ii:45:5: note: declared here
     vector(initializer_list<T>) = delete;
     ^~~~~~

The move constructor should be used, not the initialize-list one.

Reply via email to