$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56927 - sandbox/committee/rvalue_ref
From: dave_at_[hidden]
Date: 2009-10-16 14:08:01
Author: dave
Date: 2009-10-16 14:08:01 EDT (Fri, 16 Oct 2009)
New Revision: 56927
URL: http://svn.boost.org/trac/boost/changeset/56927
Log:
Fixed all my mistakes, I think.
Text files modified: 
   sandbox/committee/rvalue_ref/N2983-throwing-move.rst |   181 +++++++++++++++++++++++---------------- 
   sandbox/committee/rvalue_ref/N2983.html              |   150 +++++++++++++++++++-------------        
   2 files changed, 194 insertions(+), 137 deletions(-)
Modified: sandbox/committee/rvalue_ref/N2983-throwing-move.rst
==============================================================================
--- sandbox/committee/rvalue_ref/N2983-throwing-move.rst	(original)
+++ sandbox/committee/rvalue_ref/N2983-throwing-move.rst	2009-10-16 14:08:01 EDT (Fri, 16 Oct 2009)
@@ -74,13 +74,15 @@
 on every class author, we can deal with the issue more selectively in
 the operation being move-enabled.  There, we know whether a throwing
 move can disturb existing guarantees.  We propose that instead of
-using ``std::move(x)`` in those cases, thus granting permission for the
-compiler to use *any* available move constructor, maintainers of these
-particular operations should use ``std::nothrow_move(x)``, which only
-grants permission to use non-throwing move constructors.  Unless ``x``
-is known to have a nonthrowing move constructor, the operation would
-fall back to copying ``x``, just as though ``x`` had never acquired a move
-constructor at all.
+using ``std::move(x)`` in those cases, thus granting permission for
+the compiler to use *any* available move constructor, maintainers of
+these particular operations should use
+``std::legacy_move(x)``, which only grants
+permission to use the non-throwing move constructors of copyable
+types.  Unless ``x`` is a move-only type, or is known to have a
+nonthrowing move constructor, the operation would fall back to copying
+``x``, just as though ``x`` had never acquired a move constructor at
+all.
 
 For example, ``std::pair``\ 's move constructor, were it to be written
 out manually, could remain as it was before this issue was
@@ -105,7 +107,7 @@
           try
           {
               for (;i < s; ++i)
-                   new ((void*)(new_begin + i)) value_type( **nothrow_move(** (\*this)[i]) **)** );
+                   new ((void*)(new_begin + i)) value_type( **std::legacy_move(** (\*this)[i]) **)** );
           }
           catch(...)
           {
@@ -124,39 +126,37 @@
   }
 
 
-We stress again that the use of ``nothrow_move`` as opposed to ``move``
+We stress again that the use of ``std::legacy_move`` as opposed to ``move``
 would only be necessary under an *extremely* limited set of
 circumstances.  In particular, it would never be required in new code,
 which could simply give a *conditional* strong guarantee, e.g. âif an
 exception is thrown other than by ``T``\ 's move constructor, there are
 no effects.â
 
-Implementing ``nothrow_move``
-*****************************
+Implementing ``std::legacy_move``
+*********************************
 
-One reasonable implementation of ``std::nothrow_move`` might be::
+One possible implementation of ``std::legacy_move`` might be::
 
   template <class T>
-  typename enable_if<has_nothrow_move_constructor<T>, T&&>::type 
-  nothrow_move(T& x)
+  typename conditional<
+      !has_nothrow_move_constructor<T>::value
+      && has_copy_constructor<T>::value,
+      T&,
+      T&&
+  >::type
+  legacy_move(T& x)
   {
       return std::move(x);
   }
-  
-  template <class T>
-  typename disable_if<has_nothrow_move_constructor<T>, T&>::type 
-  nothrow_move(T& x)
-  {
-      return x;
-  }
 
-However, that begs the question of how
-``has_nothrow_move_constructor<T>`` might be implemented.  We propose
-that ``has_nothrow_move_constructor<T>`` be a conservative trait very
-much like ``has_nothrow_copy_constructor<T>`` from the current working
-draft; it would be identical to the proposed
-``is_nothrow_constructible<T,T&&>`` from N2953_.  In other words, it is
-*allowed* to return ``false`` even when the proper result is ``true``.
+We propose that ``has_nothrow_move_constructor<T>`` be a conservative
+trait very much like ``has_nothrow_copy_constructor<T>`` from the
+current working draft; it would be identical to the proposed
+``is_nothrow_constructible<T,T&&>`` from N2953_.  In other words, it
+returns ``true`` only when it can prove the move constructor doesn't
+throw, and is *allowed* to return ``false`` even when the move
+constructor can throw.
 
 An Optimization Hint
 ********************
@@ -283,7 +283,9 @@
 
     :raw-html:`<span class="ins">16 If a function with the
     exception-specification <code>throw(false)</code> throws an
-    exception, the behavior is undefined.</span>`
+    exception, the behavior is undefined. The exception-specification
+    <code>throw(true)</code> is equivalent to
+    <code>throw(...)</code>.</span>`
 
 A.13 Exception handling [gram.except]
 =====================================
@@ -319,40 +321,40 @@
 
 Add entries to table 43:
 
-+--------------------------------+---------------------------+-------------------------+
-| Template                       |Condition                  |Preconditions            |
-+================================+===========================+=========================+
-| ``template <class T>           |``T`` has a move           |``T`` shall be a complete|
-| struct has_move_constructor;`` |constructor (17.3.14).     |type.                    |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` is a class type with |``has_move_constructor<T>|
-| struct                         |a move constructor that is |::value``                |
-| has_nothrow_move_constructor;``|known not to throw any     |                         |
-|                                |exceptions.                |                         |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` has a move assignment|``T`` shall be a complete|
-| struct has_move_assign;``      |operator (17.3.13).        |type.                    |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` is a class type with |``has_move_assign<T>::   |
-| struct                         |a move assignment operator |value``                  |
-| has_nothrow_move_assign;``     |that is known not to throw |                         |
-|                                |any exceptions.            |                         |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` has a copy           |``T`` shall be a complete|
-| struct has_copy_constructor;`` |constructor (12.8).        |type, an array of unknown| 
-|                                |                           |bound, or (possibly      |
-|                                |                           |cv-qualified) ``void.``  |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` has a default        |``T`` shall be a complete|
-| struct                         |constructor (12.1).        |type, an array of unknown|
-| has_default_constructor;``     |                           |bound, or (possibly      |
-|                                |                           |cv-qualified) ``void.``  |
-+--------------------------------+---------------------------+-------------------------+
-| ``template <class T>           |``T`` has a copy assignment|``T`` shall be a complete|
-| struct has_copy_assign;``      |operator (12.8).           |type, an array of unknown|
-|                                |                           |bound, or (possibly      |
-|                                |                           |cv-qualified) ``void``.  |
-+--------------------------------+---------------------------+-------------------------+
++--------------------------------+---------------------------+-----------------------------------+
+| Template                       |Condition                  |Preconditions                      |
++================================+===========================+===================================+
+| ``template <class T>           |``T`` has a move           |``T`` shall be a complete type.    |
+| struct has_move_constructor;`` |constructor (17.3.14).     |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` is a class type with |``has_move_constructor<T> ::value``|
+| struct                         |a move constructor that is |                                   |
+| has_nothrow_move_constructor;``|known not to throw any     |                                   |
+|                                |exceptions.                |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` has a move assignment|``T`` shall be a complete type.    |
+| struct has_move_assign;``      |operator (17.3.13).        |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` is a class type with |``has_move_assign<T>:: value``     |
+| struct                         |a move assignment operator |                                   |
+| has_nothrow_move_assign;``     |that is known not to throw |                                   |
+|                                |any exceptions.            |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` has a copy           |``T`` shall be a complete type, an |
+| struct has_copy_constructor;`` |constructor (12.8).        |array of unknown bound, or         | 
+|                                |                           |(possibly cv-qualified) ``void.``  |
+|                                |                           |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` has a default        |``T`` shall be a complete type, an |
+| struct                         |constructor (12.1).        |array of unknown bound, or         |
+| has_default_constructor;``     |                           |(possibly cv-qualified) ``void.``  |
+|                                |                           |                                   |
++--------------------------------+---------------------------+-----------------------------------+
+| ``template <class T>           |``T`` has a copy assignment|``T`` shall be a complete type, an |
+| struct has_copy_assign;``      |operator (12.8).           |array of unknown bound, or         |
+|                                |                           |(possibly cv-qualified) ``void``.  |
+|                                |                           |                                   |
++--------------------------------+---------------------------+-----------------------------------+
 
 
 23.3.2.3 deque modifiers [deque.modifiers]
@@ -373,6 +375,10 @@
 23.3.6.2 vector capacity [vector.capacity]
 ==========================================
 
+Context::
+
+   void reserve(size_type n);
+
 Remove paragraph 2:
 
     :del:`2 Requires: If value_type has a move constructor, that constructor shall
@@ -388,32 +394,59 @@
     Reallocation happens at this point if and only if the current
     capacity is less than the argument of ``reserve()``. If an
     exception is thrown :raw-html:`<span class="ins">other than by the
-    move constructor of <code>T</code></span>` there are no effects.
+    move constructor of a non-CopyConstructible <code>T</code>` there
+    are no effects.
+
+-----
+
+Context::
+
+      void resize(size_type sz, const T& c);
 
 Change paragraph 13 to say:
 
     If an exception is thrown :raw-html:`<span class="ins">other than
-    by the move constructor of <code>T</code></span>` there are no
-    effects.
+    by the move constructor of a non-CopyConstructible
+    <code>T</code></span>` there are no effects.
 
 23.3.6.4 vector modifiers [vector.modifiers]
 ============================================
 
+Context::
+
+    iterator insert(const_iterator position, const T& x); 
+    iterator insert(const_iterator position, T&& x); 
+    void insert(const_iterator position, size_type n, const T& x); 
+    template <class InputIterator>
+      void insert(const_iterator position, InputIterator first, InputIterator last);
+    template <class... Args> void emplace_back(Args&&... args); 
+    template <class... Args> iterator emplace(const_iterator position, Args&&... args); 
+    void push_back(const T& x); 
+    void push_back(T&& x);
+
 Delete paragraph 1:
 
     :del:`1 Requires: If value_type has a move constructor, that constructor shall
     not throw any exceptions.`
 
-
 Change paragraph 2 as follows:
 
-    2 Remarks: Causes reallocation if the new size is greater than the old
-    capacity. If no reallocation happens, all the iterators and references 
-    before the insertion point remain valid. If an exception is thrown other 
-    than by the copy constructor, 
-    :ins: `move constructor, move assignment operator`
-    or assignment operator of ``T`` or by any InputIterator operation there are 
-    no effects.
+  2 Remarks: Causes reallocation if the new size is greater than the
+  old capacity. If no reallocation happens, all the iterators and
+  references before the insertion point remain valid. If an exception
+  is thrown other than by the copy constructor, :ins:`move
+  constructor, move assignment operator` or assignment operator of T
+  or by any InputIterator operation there are no effects.
+
+**Note:** The strong guarantee of ``push_back`` is maintained by
+paragraph 11 in 23.2.1 [container.requirements.general]
+
+-----
+
+Context::
+
+  iterator erase(const_iterator position); 
+  iterator erase(const_iterator first, const_iterator last);
 
 Change paragraph 6 as follows:
 
Modified: sandbox/committee/rvalue_ref/N2983.html
==============================================================================
--- sandbox/committee/rvalue_ref/N2983.html	(original)
+++ sandbox/committee/rvalue_ref/N2983.html	2009-10-16 14:08:01 EDT (Fri, 16 Oct 2009)
@@ -321,7 +321,7 @@
 <p class="topic-title first">index</p>
 <ul class="simple">
 <li><a class="reference internal" href="#introduction" id="id5">Introduction</a></li>
-<li><a class="reference internal" href="#implementing-nothrow-move" id="id6">Implementing <tt class="docutils literal"><span class="pre">nothrow_move</span></tt></a></li>
+<li><a class="reference internal" href="#implementing-std-legacy-move" id="id6">Implementing <tt class="docutils literal"><span class="pre">std::legacy_move</span></tt></a></li>
 <li><a class="reference internal" href="#an-optimization-hint" id="id7">An Optimization Hint</a></li>
 <li><a class="reference internal" href="#interactions-with-other-proposals" id="id8">Interactions with Other Proposals</a></li>
 <li><a class="reference internal" href="#existing-practice" id="id9">Existing Practice</a></li>
@@ -388,13 +388,15 @@
 on every class author, we can deal with the issue more selectively in
 the operation being move-enabled.  There, we know whether a throwing
 move can disturb existing guarantees.  We propose that instead of
-using <tt class="docutils literal"><span class="pre">std::move(x)</span></tt> in those cases, thus granting permission for the
-compiler to use <em>any</em> available move constructor, maintainers of these
-particular operations should use <tt class="docutils literal"><span class="pre">std::nothrow_move(x)</span></tt>, which only
-grants permission to use non-throwing move constructors.  Unless <tt class="docutils literal"><span class="pre">x</span></tt>
-is known to have a nonthrowing move constructor, the operation would
-fall back to copying <tt class="docutils literal"><span class="pre">x</span></tt>, just as though <tt class="docutils literal"><span class="pre">x</span></tt> had never acquired a move
-constructor at all.</p>
+using <tt class="docutils literal"><span class="pre">std::move(x)</span></tt> in those cases, thus granting permission for
+the compiler to use <em>any</em> available move constructor, maintainers of
+these particular operations should use
+<tt class="docutils literal"><span class="pre">std::legacy_move(x)</span></tt>, which only grants
+permission to use the non-throwing move constructors of copyable
+types.  Unless <tt class="docutils literal"><span class="pre">x</span></tt> is a move-only type, or is known to have a
+nonthrowing move constructor, the operation would fall back to copying
+<tt class="docutils literal"><span class="pre">x</span></tt>, just as though <tt class="docutils literal"><span class="pre">x</span></tt> had never acquired a move constructor at
+all.</p>
 <p>For example, <tt class="docutils literal"><span class="pre">std::pair</span></tt>'s move constructor, were it to be written
 out manually, could remain as it was before this issue was
 discovered:</p>
@@ -416,7 +418,7 @@
         try
         {
             for (;i < s; ++i)
-                 new ((void*)(new_begin + i)) value_type( <strong>nothrow_move(</strong> (*this)[i]) <strong>)</strong> );
+                 new ((void*)(new_begin + i)) value_type( <strong>std::legacy_move(</strong> (*this)[i]) <strong>)</strong> );
         }
         catch(...)
         {
@@ -434,38 +436,36 @@
     }
 }
 </pre>
-<p>We stress again that the use of <tt class="docutils literal"><span class="pre">nothrow_move</span></tt> as opposed to <tt class="docutils literal"><span class="pre">move</span></tt>
+<p>We stress again that the use of <tt class="docutils literal"><span class="pre">std::legacy_move</span></tt> as opposed to <tt class="docutils literal"><span class="pre">move</span></tt>
 would only be necessary under an <em>extremely</em> limited set of
 circumstances.  In particular, it would never be required in new code,
 which could simply give a <em>conditional</em> strong guarantee, e.g. âif an
 exception is thrown other than by <tt class="docutils literal"><span class="pre">T</span></tt>'s move constructor, there are
 no effects.â</p>
 </div>
-<div class="section" id="implementing-nothrow-move">
-<h1><a class="toc-backref" href="#id6">Implementing <tt class="docutils literal"><span class="pre">nothrow_move</span></tt></a></h1>
-<p>One reasonable implementation of <tt class="docutils literal"><span class="pre">std::nothrow_move</span></tt> might be:</p>
+<div class="section" id="implementing-std-legacy-move">
+<h1><a class="toc-backref" href="#id6">Implementing <tt class="docutils literal"><span class="pre">std::legacy_move</span></tt></a></h1>
+<p>One possible implementation of <tt class="docutils literal"><span class="pre">std::legacy_move</span></tt> might be:</p>
 <pre class="literal-block">
 template <class T>
-typename enable_if<has_nothrow_move_constructor<T>, T&&>::type
-nothrow_move(T& x)
+typename conditional<
+    !has_nothrow_move_constructor<T>::value
+    && has_copy_constructor<T>::value,
+    T&,
+    T&&
+>::type
+legacy_move(T& x)
 {
     return std::move(x);
 }
-
-template <class T>
-typename disable_if<has_nothrow_move_constructor<T>, T&>::type
-nothrow_move(T& x)
-{
-    return x;
-}
 </pre>
-<p>However, that begs the question of how
-<tt class="docutils literal"><span class="pre">has_nothrow_move_constructor<T></span></tt> might be implemented.  We propose
-that <tt class="docutils literal"><span class="pre">has_nothrow_move_constructor<T></span></tt> be a conservative trait very
-much like <tt class="docutils literal"><span class="pre">has_nothrow_copy_constructor<T></span></tt> from the current working
-draft; it would be identical to the proposed
-<tt class="docutils literal"><span class="pre">is_nothrow_constructible<T,T&&></span></tt> from <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2953.html">N2953</a>.  In other words, it is
-<em>allowed</em> to return <tt class="docutils literal"><span class="pre">false</span></tt> even when the proper result is <tt class="docutils literal"><span class="pre">true</span></tt>.</p>
+<p>We propose that <tt class="docutils literal"><span class="pre">has_nothrow_move_constructor<T></span></tt> be a conservative
+trait very much like <tt class="docutils literal"><span class="pre">has_nothrow_copy_constructor<T></span></tt> from the
+current working draft; it would be identical to the proposed
+<tt class="docutils literal"><span class="pre">is_nothrow_constructible<T,T&&></span></tt> from <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2953.html">N2953</a>.  In other words, it
+returns <tt class="docutils literal"><span class="pre">true</span></tt> only when it can prove the move constructor doesn't
+throw, and is <em>allowed</em> to return <tt class="docutils literal"><span class="pre">false</span></tt> even when the move
+constructor can throw.</p>
 </div>
 <div class="section" id="an-optimization-hint">
 <h1><a class="toc-backref" href="#id7">An Optimization Hint</a></h1>
@@ -563,7 +563,9 @@
 <code>bool</code> (Clause 4).</span></span></p>
 <p><span class="raw-html"><span class="ins">16 If a function with the
 exception-specification <code>throw(false)</code> throws an
-exception, the behavior is undefined.</span></span></p>
+exception, the behavior is undefined. The exception-specification
+<code>throw(true)</code> is equivalent to
+<code>throw(...)</code>.</span></span></p>
 </blockquote>
 </div>
 <div class="section" id="a-13-exception-handling-gram-except">
@@ -596,9 +598,9 @@
 <p>Add entries to table 43:</p>
 <table border="1" class="docutils">
 <colgroup>
-<col width="38%" />
-<col width="32%" />
-<col width="30%" />
+<col width="34%" />
+<col width="29%" />
+<col width="37%" />
 </colgroup>
 <thead valign="bottom">
 <tr><th class="head">Template</th>
@@ -611,8 +613,7 @@
 <span class="pre">struct</span> <span class="pre">has_move_constructor;</span></tt></td>
 <td><tt class="docutils literal"><span class="pre">T</span></tt> has a move
 constructor (17.3.14).</td>
-<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete
-type.</td>
+<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete type.</td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span>
@@ -621,15 +622,13 @@
 a move constructor that is
 known not to throw any
 exceptions.</td>
-<td><tt class="docutils literal"><span class="pre">has_move_constructor<T></span>
-<span class="pre">::value</span></tt></td>
+<td><tt class="docutils literal"><span class="pre">has_move_constructor<T></span> <span class="pre">::value</span></tt></td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span> <span class="pre">has_move_assign;</span></tt></td>
 <td><tt class="docutils literal"><span class="pre">T</span></tt> has a move assignment
 operator (17.3.13).</td>
-<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete
-type.</td>
+<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete type.</td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span>
@@ -638,36 +637,32 @@
 a move assignment operator
 that is known not to throw
 any exceptions.</td>
-<td><tt class="docutils literal"><span class="pre">has_move_assign<T>::</span>
-<span class="pre">value</span></tt></td>
+<td><tt class="docutils literal"><span class="pre">has_move_assign<T>::</span> <span class="pre">value</span></tt></td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span> <span class="pre">has_copy_constructor;</span></tt></td>
 <td><tt class="docutils literal"><span class="pre">T</span></tt> has a copy
 constructor (12.8).</td>
-<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete
-type, an array of unknown
-bound, or (possibly
-cv-qualified) <tt class="docutils literal"><span class="pre">void.</span></tt></td>
+<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete type, an
+array of unknown bound, or
+(possibly cv-qualified) <tt class="docutils literal"><span class="pre">void.</span></tt></td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span>
 <span class="pre">has_default_constructor;</span></tt></td>
 <td><tt class="docutils literal"><span class="pre">T</span></tt> has a default
 constructor (12.1).</td>
-<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete
-type, an array of unknown
-bound, or (possibly
-cv-qualified) <tt class="docutils literal"><span class="pre">void.</span></tt></td>
+<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete type, an
+array of unknown bound, or
+(possibly cv-qualified) <tt class="docutils literal"><span class="pre">void.</span></tt></td>
 </tr>
 <tr><td><tt class="docutils literal"><span class="pre">template</span> <span class="pre"><class</span> <span class="pre">T></span>
 <span class="pre">struct</span> <span class="pre">has_copy_assign;</span></tt></td>
 <td><tt class="docutils literal"><span class="pre">T</span></tt> has a copy assignment
 operator (12.8).</td>
-<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete
-type, an array of unknown
-bound, or (possibly
-cv-qualified) <tt class="docutils literal"><span class="pre">void</span></tt>.</td>
+<td><tt class="docutils literal"><span class="pre">T</span></tt> shall be a complete type, an
+array of unknown bound, or
+(possibly cv-qualified) <tt class="docutils literal"><span class="pre">void</span></tt>.</td>
 </tr>
 </tbody>
 </table>
@@ -687,6 +682,10 @@
 </div>
 <div class="section" id="vector-capacity-vector-capacity">
 <h2><a class="toc-backref" href="#id16">23.3.6.2 vector capacity [vector.capacity]</a></h2>
+<p>Context:</p>
+<pre class="literal-block">
+void reserve(size_type n);
+</pre>
 <p>Remove paragraph 2:</p>
 <blockquote>
 <span class="del">2 Requires: If value_type has a move constructor, that constructor shall
@@ -701,28 +700,53 @@
 Reallocation happens at this point if and only if the current
 capacity is less than the argument of <tt class="docutils literal"><span class="pre">reserve()</span></tt>. If an
 exception is thrown <span class="raw-html"><span class="ins">other than by the
-move constructor of <code>T</code></span></span> there are no effects.</blockquote>
+move constructor of a non-CopyConstructible <code>T</code></span> there
+are no effects.</blockquote>
+<hr class="docutils" />
+<p>Context:</p>
+<pre class="literal-block">
+void resize(size_type sz, const T& c);
+</pre>
 <p>Change paragraph 13 to say:</p>
 <blockquote>
 If an exception is thrown <span class="raw-html"><span class="ins">other than
-by the move constructor of <code>T</code></span></span> there are no
-effects.</blockquote>
+by the move constructor of a non-CopyConstructible
+<code>T</code></span></span> there are no effects.</blockquote>
 </div>
 <div class="section" id="vector-modifiers-vector-modifiers">
 <h2><a class="toc-backref" href="#id17">23.3.6.4 vector modifiers [vector.modifiers]</a></h2>
+<p>Context:</p>
+<pre class="literal-block">
+iterator insert(const_iterator position, const T& x);
+iterator insert(const_iterator position, T&& x);
+void insert(const_iterator position, size_type n, const T& x);
+template <class InputIterator>
+  void insert(const_iterator position, InputIterator first, InputIterator last);
+template <class... Args> void emplace_back(Args&&... args);
+template <class... Args> iterator emplace(const_iterator position, Args&&... args);
+void push_back(const T& x);
+void push_back(T&& x);
+</pre>
 <p>Delete paragraph 1:</p>
 <blockquote>
 <span class="del">1 Requires: If value_type has a move constructor, that constructor shall
 not throw any exceptions.</span></blockquote>
 <p>Change paragraph 2 as follows:</p>
 <blockquote>
-2 Remarks: Causes reallocation if the new size is greater than the old
-capacity. If no reallocation happens, all the iterators and references
-before the insertion point remain valid. If an exception is thrown other
-than by the copy constructor,
-:ins: <cite>move constructor, move assignment operator</cite>
-or assignment operator of <tt class="docutils literal"><span class="pre">T</span></tt> or by any InputIterator operation there are
-no effects.</blockquote>
+2 Remarks: Causes reallocation if the new size is greater than the
+old capacity. If no reallocation happens, all the iterators and
+references before the insertion point remain valid. If an exception
+is thrown other than by the copy constructor, <span class="ins">move
+constructor, move assignment operator</span> or assignment operator of T
+or by any InputIterator operation there are no effects.</blockquote>
+<p><strong>Note:</strong> The strong guarantee of <tt class="docutils literal"><span class="pre">push_back</span></tt> is maintained by
+paragraph 11 in 23.2.1 [container.requirements.general]</p>
+<hr class="docutils" />
+<p>Context:</p>
+<pre class="literal-block">
+iterator erase(const_iterator position);
+iterator erase(const_iterator first, const_iterator last);
+</pre>
 <p>Change paragraph 6 as follows:</p>
 <blockquote>
 6 Throws: Nothing unless an exception is thrown by the copy