Date
2013-01-25.00:32:44
Message id
4648

Content

The new concepts for the insert iterators mandate an extra copy when inserting an lvalue:

requires CopyConstructible<Cont::value_type>
  back_insert_iterator<Cont>& 
  operator=(const Cont::value_type& value);

-1- Effects: push_back(*container, Cont::value_type(value));

The reason is to convert value into an rvalue because the current BackInsertionContainer concept only handles push_back-ing rvalues:

concept BackInsertionContainer<typename C> : Container<C> { 
  void push_back(C&, value_type&&); 
}

Without the conversion of value to an rvalue, the assignment operator fails to concept check.

A solution is to modify the BackInsertionContainer concept so that the client can pass in the parameter type for push_back similar to what is already done for the OutputIterator concept:

concept BackInsertionContainer<typename C, typename Value = C::value_type&&>
  : Container<C> { 
     void push_back(C&, Value); 
}

This allows the assignment operator to be adjusted appropriately:

requires BackInsertionContainer<Cont, Cont::value_type const&> &&
         CopyConstructible<Cont::value_type>
  back_insert_iterator<Cont>& 
  operator=(const Cont::value_type& value);

-1- Effects: push_back(*container, value);