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);