Title
Missing extended copy constructor in container adaptors
Status
c++11
Section
[container.adaptors]
Submitter
Pablo Halpern

Created on 2009-08-26.00:00:00 last changed 162 months ago

Messages

Date: 2010-10-21.18:28:33

[ This resolution has been harmonized with the proposed resolution to issue 1194 ]

Change [queue.defn], p1:

template <class T, class Container = deque<T> >
class queue {
public:
  typedef typename Container::value_type      value_type;
  typedef typename Container::reference       reference;
  typedef typename Container::const_reference const_reference;
  typedef typename Container::size_type       size_type;
  typedef Container                           container_type;
protected:
  Container c;

public:
  explicit queue(const Container&);
  explicit queue(Container&& = Container());
  queue(queue&& q);

  template <class Alloc> explicit queue(const Alloc&);
  template <class Alloc> queue(const Container&, const Alloc&);
  template <class Alloc> queue(Container&&, const Alloc&);
  template <class Alloc> queue(const queue&, const Alloc&);
  template <class Alloc> queue(queue&&, const Alloc&);
  queue& operator=(queue&& q);

  bool empty() const          { return c.empty(); }
  ...
};

To the new section [queue.cons], introduced in 1194, add:

template <class Alloc> 
  queue(const queue& q, const Alloc& a);

Effects: Initializes c with q.c as the first argument and a as the second argument.

Change [priority.queue] as follows (I've an included an editorial change to move the poorly-placed move-assignment operator):

template <class T, class Container = vector<T>,
          class Compare = less<typename Container::value_type> >
class priority_queue {
public:
  typedef typename Container::value_type      value_type;
  typedef typename Container::reference       reference;
  typedef typename Container::const_reference const_reference;
  typedef typename Container::size_type       size_type;
  typedef          Container                  container_type;
protected:
  Container c;
  Compare comp;

public:
  priority_queue(const Compare& x, const Container&);
  explicit priority_queue(const Compare& x = Compare(), Container&& = Container());
  template <class InputIterator>
    priority_queue(InputIterator first, InputIterator last,
                   const Compare& x, const Container&);
  template <class InputIterator>
    priority_queue(InputIterator first, InputIterator last,
                   const Compare& x = Compare(), Container&& = Container());
  priority_queue(priority_queue&&);
  priority_queue& operator=(priority_queue&&);
  template <class Alloc> explicit priority_queue(const Alloc&);
  template <class Alloc> priority_queue(const Compare&, const Alloc&);
  template <class Alloc> priority_queue(const Compare&,
                                        const Container&, const Alloc&);
  template <class Alloc> priority_queue(const Compare&,
                                        Container&&, const Alloc&);
  template <class Alloc> priority_queue(const priority_queue&, const Alloc&);
  template <class Alloc> priority_queue(priority_queue&&, const Alloc&);

  priority_queue& operator=(priority_queue&&);
  ...
};

Add to [priqueue.cons]:

template <class Alloc>
  priority_queue(const priority_queue& q, const Alloc& a);

Effects: Initializes c with q.c as the first argument and a as the second argument, and initializes comp with q.comp.

Change [stack.defn]:

template <class T, class Container = deque<T> >
class stack {
public:
  typedef typename Container::value_type      value_type;
  typedef typename Container::reference       reference;
  typedef typename Container::const_reference const_reference;
  typedef typename Container::size_type       size_type;
  typedef Container                           container_type;
protected:
  Container c;

public:
  explicit stack(const Container&);
  explicit stack(Container&& = Container());
  stack(stack&& s);

  template <class Alloc> explicit stack(const Alloc&);
  template <class Alloc> stack(const Container&, const Alloc&);
  template <class Alloc> stack(Container&&, const Alloc&);
  template <class Alloc> stack(const stack&, const Alloc&);
  template <class Alloc> stack(stack&&, const Alloc&);
  stack& operator=(stack&& s);

  bool empty() const          { return c.empty(); }
  ...
};

To the new section [stack.cons], introduced in 1194, add:

template <class Alloc> 
  stack(const stack& s, const Alloc& a);

Effects: Initializes c with s.c as the first argument and a as the second argument.

Date: 2010-02-01.00:00:00

[ 2010-02-01 Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]

Date: 2009-08-26.00:00:00

queue has a constructor:

template <class Alloc>
  queue(queue&&, const Alloc&);

but it is missing a corresponding constructor:

template <class Alloc>
  queue(const queue&, const Alloc&);

The same is true of priority_queue, and stack. This "extended copy constructor" is needed for consistency and to ensure that the user of a container adaptor can always specify the allocator for his adaptor.

History
Date User Action Args
2011-08-23 20:07:26adminsetstatus: wp -> c++11
2010-10-21 18:28:33adminsetmessages: + msg1117
2010-10-21 18:28:33adminsetmessages: + msg1116
2009-08-26 00:00:00admincreate