During the Rapperswil meeting the Library Working Group decided to revise the library to change specifications stating Throws: Nothing to specify noexcept
This paper presents proposed wording for this change. However, it does not go further than removing Throws: Nothing. For example, it does not eliminate cluases of the form Throws: Nothing unless ... and similiar clauses.
The paper partially addresses National Body comments CH 16 and GB 60.
All changes in this paper are against N3126.
typedef unspecified exception_ptr; exception_ptr current_exception()noexcept;
exception_ptr current_exception() noexcept;
8 Throws: nothing.
Header <initializer_list> synopsis
namespace std {
  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;
    initializer_list() noexcept;
    size_t size() const noexcept; // number of elements
    const E* begin() const noexcept; // first element
    const E* end() const noexcept; // one past the last element
  };
  // 18.9.3 initializer list range access
  template<class E> const E* begin(initializer_list<E> il);
  template<class E> const E* end(initializer_list<E> il);
}
initializer_list() noexcept;
3. Throws: nothing.
const E* begin() const noexcept;
2. Throws: nothing.
const E* end() const noexcept;
4. Throws: nothing.
size_t size() const noexcept;
6. Throws: nothing.
... // 19.5.4 Comparison operators: bool operator==(const error_code& lhs, const error_code& rhs) noexcept; bool operator==(const error_code& lhs, const error_condition& rhs) noexcept; bool operator==(const error_condition& lhs, const error_code& rhs) noexcept; bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept; bool operator!=(const error_code& lhs, const error_code& rhs) noexcept; bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
namespace std {
  class error_category {
  public:
    virtual ~error_category();
    error_category(const error_category&) = delete;
    error_category& operator=(const error_category&) = delete;
    virtual const char* name() const noexcept = 0;
    virtual error_condition default_error_condition(int ev) const noexcept;
    virtual bool equivalent(int code, const error_condition& condition) const noexcept;
    virtual bool equivalent(const error_code& code, int condition) const noexcept;
    virtual string message(int ev) const = 0;
    bool operator==(const error_category& rhs) const;
    bool operator!=(const error_category& rhs) const;
    bool operator<(const error_category& rhs) const noexcept;
  };
  const error_category& generic_category();
  const error_category& system_category();
} // namespace std
virtual const char* name()const noexcept = 0;
2. Throws: nothing.
virtual error_condition default_error_condition(int ev) const noexcept;
4. Throws: nothing.
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
6. Throws: nothing.
virtual bool equivalent(const error_code& code, int condition) const noexcept;
8. Throws: nothing.
bool operator<,(const error_category& rhs) const noexcept;
4. Throws: nothing.
Before p.1
virtual const char* name() const noexcept = 0;
2. Throws: nothing.
After p. 2
virtual error_condition default_error_condition(int ev) const noexcept;
4. Throws: nothing.
After p. 4
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
6. Throws: nothing.
After p. 6
virtual bool equivalent(const error_code& code, int condition) const noexcept;
8. Throws: nothing.
After p.1
namespace std {
  class error_code {
  public:
    // 19.5.2.2 constructors:
    error_code() noexcept;
    error_code(int val, const error_category& cat) noexcept;
    template <class ErrorCodeEnum>
      error_code(ErrorCodeEnum e) noexcept;
    // 19.5.2.3 modifiers:
    void assign(int val, const error_category& cat) noexcept;
    template <class ErrorCodeEnum>
      errorcode& operator=(ErrorCodeEnum e) noexcept;
    void clear();
    // 19.5.2.4 observers:
    int value() const noexcept;
    const error_category& category() const noexcept;
    error_condition default_error_condition() const noexcept;
    string message() const;
    explicit operator bool() const noexcept;
  private:
    int val_; // exposition only
    const error_category* cat_; // exposition only
  };
  // 19.5.2.5 non-member functions:
  bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
  template <class charT, class traits>
    basic_ostream<charT,traits>&
      operator<<(basic_ostream<charT,traits>& os, const error_code& ec);
} // namespace std
Before p. 1
error_code() noexcept;
3. Throws: Nothing.
After p. 3
error_code(int val, const error_category& cat) noexcept;
6. Throws: Nothing.
After p. 6
template <class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept;
9. Throws: Nothing.
Before p. 1
void assign(int val, const error_category& cat) noexcept;
2. Throws: Nothing.
After p. 2
template <class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept;
5. Throws: Nothing.
Before p. 1
int value() const noexcept;
2. Throws: Nothing.
After p. 2
const error_category& category() const noexcept;
4. Throws: Nothing.
After p. 4
error_condition default_error_condition() const noexcept;
6. Throws: Nothing.
After p. 7
explicit operator bool() const noexcept;
9. Throws: Nothing.
Before p. 1
bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
2. Throws: Nothing.
After p.1
namespace std { 
  class error_condition { 
  public: 
    // 19.5.3.2 constructors: 
    error_condition() noexcept; 
    error_condition(int val, const error_category& cat) noexcept; 
    template <class ErrorConditionEnum>
      error_condition(ErrorConditionEnum e) noexcept; 
    
    // 19.5.3.3 modifiers: 
    void assign(int val, const error_category& cat) noexcept; 
    template<class ErrorConditionEnum> 
      error_condition& operator=(ErrorConditionEnum e) noexcept; 
    void clear(); 
    
    // 19.5.3.4 observers: 
    int value() const noexcept;
    const error_category& category() const noexcept; 
    string message() const; 
    explicit operator bool() const noexcept; 
    
  private: 
    int val_; // exposition only 
    const error_category* cat_; // exposition only 
  }; 
  
  // 19.5.3.5 non-member functions: 
  bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept; 
} // namespace std
Before p. 1
error_condition() noexcept;
3 Throws: Nothing.
After p. 3
error_condition(int val, const error_category& cat) noexcept;
6 Throws: Nothing.
After p. 6
template <class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept;
9 Throws: Nothing.
Before p. 1
void assign(int val, const error_category& cat) noexcept;
2 Throws: Nothing.
After p. 2
template <class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept;
5 Throws: Nothing.
Before p. 1
int value() const noexcept;
2 Throws: Nothing.
After p. 2
const error_category& category() const noexcept;
4 Throws: Nothing.
After p. 5
explicit operator bool() const noexcept;
7 Throws: Nothing.
Before p. 1
bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
2 Throws: Nothing.
Before p. 1
bool operator==(const error_code& lhs, const error_code& rhs) noexcept;
2 Throws: Nothing.
After p. 2
bool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
4 Throws: Nothing.
After p. 4
bool operator==(const error_condition& lhs, const error_code& rhs) noexcept;
6 Throws: Nothing.
After p. 6
bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
8 Throws: Nothing.
After p. 8
bool operator!=(const error_code& lhs, const error_code& rhs) noexcept; bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
10 Throws: Nothing.
After p. 1
... template<size_t I, class T1, class T2> typename tuple_element<I, std::pair<T1, T2> >::type& get(pair<T1, T2>&) noexcept; template<size_t I, class T1, class T2> const typename tuple_element<I, std::pair<T1, T2> >::type& get(const pair<T1, T2>&) noexcept; ...
After p. 4
template<size_t I, class T1, class T2> typename tuple_element<I, std::pair<T1, T2> >::type& get(pair<T1, T2>&) noexcept; template<size_t I, class T1, class T2> const typename tuple_element<I, std::pair<T1, T2> >::type& get(const pair<T1, T2>&) noexcept;
6 Throws: Nothing.
After p. 1
... template <size_t I, class... Types> typename tuple_element<I, tuple<Types...> >::type& get(tuple<Types...>&); noexcept template <size_t I, class... Types> typename tuple_element<I, tuple<Types...> >::type const& get(const tuple<Types...>&); noexcept ...
Before p. 1
template <size_t I, class... Types> typename tuple_element<I, tuple<Types...> >::type& get(tuple<Types...>& t); noexcept
3 Throws: Nothing.
After p. 3
template <size_t I, class... Types> typename tuple_element<I, tuple<Types...> >::type const& get(const tuple<Types...>& t); noexcept
6 Throws: Nothing.
After p. 1
... // element access: constexpr bool operator[](size_t pos) const noexcept; // for b[i]; reference operator[](size_t pos) noexcept; // for b[i]; ...
After p. 48
constexpr bool operator[](size_t pos) noexcept;
50 Throws: Nothing.
After p. 51
bitset<N>::reference operator[](size_t pos) noexcept;
53 Throws: Nothing.
After p. 1
... // 20.8.4, reference_wrapper: template <class T>class reference_wrapper; template <class T>reference_wrapper<T> ref(T&) noexcept; template <class T>reference_wrapper<const T> cref(const T&) noexcept; template <class T>void ref(const T&&) = delete; template <class T>void cref(const T&&) = delete; template <class T>reference_wrapper<T> ref(reference_wrapper<T>) noexcept; template <class T>reference_wrapper<const T> cref(reference_wrapper<T>) noexcept; ... // 20.8.13, member function adaptors: template<class R, class T> unspecified mem_fn(R T::*) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...)) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile &&) noexcept; ...
namespace std { 
  template <class T> class reference_wrapper 
    : public unary_function<T1, R> // see below 
    : public binary_function<T1, T2, R> // see below 
  { 
  public : 
    // types 
    typedef T type; 
    typedef see below result_type; // not always defined 
    
    // construct/copy/destroy 
    reference_wrapper(T&) noexcept; 
    reference_wrapper(T&&) = delete; // do not bind to temporary objects 
    reference_wrapper(const reference_wrapper<T>& x) noexcept; 
    
    // assignment 
    reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept; 
    
    // access 
    operator T& () const noexcept; 
    T& get() const noexcept; 
    
    // invocation 
    template <class... ArgTypes>
      typename result_of<T(ArgTypes...)>::type 
        operator() (ArgTypes&&...) const; 
  }; 
}
Before p. 1
reference_wrapper(T& t) noexcept;
2 Throws: nothing.
After p. 2
reference_wrapper(const reference_wrapper<T>& x) noexcept;
4 Throws: nothing.
Before p. 1
reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept;
2 Throws: nothing.
Before p. 1
operator T& () const noexcept;
2 Throws: nothing.
After p. 2
T& get() const noexcept;
4 Throws: nothing.
Before p. 1
template <class T> reference_wrapper<T> ref(T& t) noexcept;
2 Throws: nothing.
After p. 2
template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept;
4 Throws: nothing.
After p. 4
template <class T> reference_wrapper<const T> cref(const T& t) noexcept;
6 Throws: nothing.
After p. 6
template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;
8 Throws: nothing.
Before p. 1
template<class R, class T> unspecified mem_fn(R T::* pm) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...)) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) volatile) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const volatile) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) volatile &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const volatile &) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) volatile &&) noexcept; template<class R, class T, class... Args> unspecified mem_fn(R (T::* pm)(Args...) const volatile &&) noexcept;
4 Throws: nothing.
Before p.1
namespace std {
  template<class> class function; // undefined
  template<class R, class... ArgTypes>
  class function<R(ArgTypes...)>
    : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and ArgTypes contains T1
    : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and ArgTypes contains T1 and T2
  {
  public:
    typedef R result_type;
    // 20.8.14.2.1, construct/copy/destroy:
    function() noexcept;
    function(nullptr_t) noexcept;
    function(const function&);
    function(function&&);
    template<class F> function(F);
    template<class A> function(allocator_arg_t, const A&) noexcept;
    template<class A> function(allocator_arg_t, const A&,
      nullptr_t) noexcept;
    template<class A> function(allocator_arg_t, const A&,
      const function&);
    template<class A> function(allocator_arg_t, const A&,
      function&&);
    template<class F, class A> function(allocator_arg_t, const A&, F);
    function& operator=(const function&);
    function& operator=(function&&);
    function& operator=(nullptr_t);
    template<class F> function& operator=(F&&);
    template<class F> function& operator=(reference_wrapper<F>) noexcept;
    ~function();
    // 20.8.14.2.2, function modifiers:
    void swap(function&) noexcept;
    template<class F, class A> void assign(F&&, const A&);
    // 20.8.14.2.3, function capacity:
    explicit operator bool() const noexcept;
    // deleted overloads close possible hole in the type system
    template<class R2, class... ArgTypes2>
      bool operator==(const function<R2(ArgTypes2...)>&) = delete;
    template<class R2, class... ArgTypes2>
      bool operator!=(const function<R2(ArgTypes2...)>&) = delete;
    // 20.8.14.2.4, function invocation:
    R operator()(ArgTypes...) const;
    // 20.8.14.2.5, function target access:
    const std::type_info& target_type() const noexcept;
    template <typename T> T* target() noexcept;
    template <typename T> const T* target() const noexcept;
  };
  // 20.8.14.2.6, Null pointer comparisons:
  template <class R, class... ArgTypes>
    bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
  template <class R, class... ArgTypes>
    bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
  template <class R, class... ArgTypes>
    bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept;
  template <class R, class... ArgTypes>
    bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept;
  // 20.8.14.2.7, specialized algorithms:
  template <class R, class... ArgTypes>
    void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&);
  template<class R, class... ArgTypes, class Alloc>
    struct uses_allocator<function<R(ArgTypes...)>, Alloc>
      : true_type { };
}
After p. 1
function() noexcept; template <class A> function(allocator_arg_t, const A& a) noexcept;
3 Throws: nothing.
After p. 3
function(nullptr_t) noexcept; template <class A> function(allocator_arg_t, const A& a, nullptr_t) noexcept;
3 Throws: nothing.
After p. 21
template<class F> function& operator=(reference_wrapper<F> f) noexcept;
24 Throws: nothing.
Before p. 1
void swap(function& other) noexcept;
2 Throws: nothing.
Before p. 1
explicit operator bool() const noexcept;
2 Throws: nothing.
Before p. 1
const std::type_info& target_type() const noexcept;
2 Throws: nothing.
After p. 2
template<typename T> T* target() noexcept; template<typename T> const T* target() const noexcept;
5 Throws: nothing.
Before p. 1
template <class R, class... ArgTypes> bool operator==(const function<R(ArgTypes...)>& f, nullptr_t) noexcept; template <class R, class... ArgTypes> bool operator==(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;
2 Throws: nothing.
After p. 2
template <class R, class... ArgTypes> bool operator!=(const function<R(ArgTypes...)>& f, nullptr_t) noexcept; template <class R, class... ArgTypes> bool operator!=(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;
4 Throws: nothing.
After p. 1
...
  // 20.9.9, specialized algorithms:
  template <class T> T* addressof(T& r) noexcept;
...
  // 20.9.11.5, shared_ptr atomic access:
  template<class T>
    bool atomic_is_lock_free(const shared_ptr<T>* p) noexcept;
  template<class T>
    shared_ptr<T> atomic_load(const shared_ptr<T>* p);
  template<class T>
    shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo) noexcept;
  template<class T>
    void atomic_store(shared_ptr<T>* p, shared_ptr<T> r);
  template<class T>
    void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo) noexcept;
  template<class T>
    shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r);
  template<class T>
    shared_ptr<T> atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r,
                                                 memory_order mo) noexcept;
  template<class T>
    bool atomic_compare_exchange_weak(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
  template<class T>
    bool atomic_compare_exchange_strong(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w);
  template<class T>
    bool atomic_compare_exchange_weak_explicit(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
      memory_order success, memory_order failure) noexcept;
  template<class T>
    bool atomic_compare_exchange_strong_explicit(
      shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
      memory_order success, memory_order failure) noexcept;
...
  // 20.9.12, Pointer safety
  enum class pointer_safety { relaxed, preferred, strict };
  void declare_reachable(void *p);
  template <class T> T *undeclare_reachable(T *p) noexcept;
  void declare_no_pointers(char *p, size_t n) noexcept;
  void undeclare_no_pointers(char *p, size_t n) noexcept;
  pointer_safety get_pointer_safety() noexcept;
...
Before p. 1
template <class T> T* addressof(T& r) noexcept;
At the end of p. 1
Throws: nothing.
Before p. 1
namespace std {
  template <class T, class D = default_delete<T>> class unique_ptr {
  public:
    typedef see below pointer;
    typedef T element_type;
    typedef D deleter_type;
    // constructors
    constexpr unique_ptr() noexcept;
    explicit unique_ptr(pointer p) noexcept;
    unique_ptr(pointer p, implementation-defined d1) noexcept;
    unique_ptr(pointer p, implementation-defined d2) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) : unique_ptr() { }
    template <class U, class E>
      unique_ptr(unique_ptr<U, E>&& u) noexcept;
    template <class U>
      unique_ptr(auto_ptr<U>&& u) noexcept;
    // destructor
    ~unique_ptr() noexcept;
    // assignment
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
    // observers
    typename add_lvalue_reference<T>::type operator*() const;
    pointer operator->() const noexcept;
    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
    // modifiers
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void swap(unique_ptr& u) noexcept;
    // disable copy from lvalue
    unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
  };
}
Before p. 1
constexpr unique_ptr() noexcept;
4 Throws: nothing.
After p. 5
unique_ptr(pointer p) noexcept;
9 Throws: nothing.
After p. 10
unique_ptr(pointer p, see below d1) noexcept; unique_ptr(pointer p, see below d2) noexcept;
17 Throws: nothing.
After p. 17
unique_ptr(unique_ptr&& u) noexcept;
21 Throws: nothing.
After p. 21
template <class U, class E> unique_ptr(unique_ptr<U, E>&& u) noexcept;
26 Throws: nothing.
After p. 26
template <class U> unique_ptr(auto_ptr<U>&& u) noexcept;
29 Throws: nothing.
Before p. 1
~unique_ptr() noexcept;
3 Throws: nothing.
Before p. 1
unique_ptr& operator=(unique_ptr&& u) noexcept;
4 Throws: nothing.
After p. 4
template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
9 Throws: nothing.
After p. 9
unique_ptr& operator=(nullptr_t) noexcept;
13 Throws: nothing.
After p. 2
pointer operator->() const noexcept;
5 Throws: nothing.
After p. 6
pointer get() const noexcept;
8 Throws: nothing.
After p. 8
deleter_type& get_deleter() noexcept; const deleter_type& get_deleter() const noexcept;
10 Throws: nothing.
After p. 10
explicit operator bool() const noexcept;
12 Throws: nothing.
Before p. 1
pointer release() noexcept;
3 Throws: nothing.
After p. 3
void reset(pointer p = pointer()) noexcept;
7 Throws: nothing.
After p. 7
void swap(unique_ptr& u) noexcept;
10 Throws: nothing.
Before p. 1
namespace std {
  template <class T, class D> class unique_ptr<T[], D> {
  public:
    typedef implementation-defined pointer;
    typedef T element_type;
    typedef D deleter_type;
    // constructors
    constexpr unique_ptr() noexcept;
    explicit unique_ptr(pointer p) noexcept;
    unique_ptr(pointer p, implementation-defined d) noexcept;
    unique_ptr(pointer p, implementation-defined d) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) : unique_ptr() { }
    // destructor
    unique_ptr() noexcept;
    // assignment
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
    // observers
    T& operator[](size_t i) const;
    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
    // modifiers
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void reset(nullptr_t) noexcept;
    template <class U> void reset(U) = delete;
    void swap(unique_ptr& u) noexcept;
    // disable copy from lvalue
    unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
  };
}
Before p. 1
unique_ptr(pointer p) noexcept; unique_ptr(pointer p, implementation-defined d) noexcept; unique_ptr(pointer p, implementation-defined d) noexcept;
Before p. 1
void reset(pointer p = pointer()) noexcept; void reset(nullptr_t p) noexcept;
3 Throws: nothing.
Before p. 1
namespace std {
  class bad_weak_ptr: public std::exception {
  public:
    bad_weak_ptr() noexcept;
  };
} // namespace std
After p. 1
bad_weak_ptr()noexcept;
3 Throws: nothing.
After p. 1
namespace std {
  template<class T> class shared_ptr {
  public:
    typedef T element_type;
    // 20.9.11.2.1, constructors:
    constexpr shared_ptr() noexcept;
    template<class Y> explicit shared_ptr(Y* p);
    template<class Y, class D> shared_ptr(Y* p, D d);
    template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
    template <class D> shared_ptr(nullptr_t p, D d)
    template <class D, class A> shared_ptr(nullptr_t p, D d, A a)
    template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
    shared_ptr(const shared_ptr& r) noexcept;
    template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
    shared_ptr(shared_ptr&& r) noexcept;
    template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
    template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
    template<class Y> shared_ptr(auto_ptr<Y>&& r);
    template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
    constexpr shared_ptr(nullptr_t) : shared_ptr() { }
    // 20.9.11.2.2, destructor:
    ~shared_ptr() noexcept;
    // 20.9.11.2.3, assignment:
    shared_ptr& operator=(const shared_ptr& r);
    template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r);
    shared_ptr& operator=(shared_ptr&& r);
    template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r);
    template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r);
    template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r);
    // 20.9.11.2.4, modifiers:
    void swap(shared_ptr& r) noexcept;
    void reset();
    template<class Y> void reset(Y* p);
    template<class Y, class D> void reset(Y* p, D d);
    template<class Y, class D, class A> void reset(Y* p, D d, A a);
    // 20.9.11.2.5, observers:
    T* get() const noexcept;
    T& operator*() const noexcept;
    T* operator->() const noexcept;
    long use_count() const noexcept;
    bool unique() const noexcept;
    explicit operator bool() const noexcept;
    template<class U> bool owner_before(shared_ptr<U> const& b) const;
    template<class U> bool owner_before(weak_ptr<U> const& b) const;
  };
  // 20.9.11.2.6, shared_ptr creation
  template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);
  template<class T, class A, class... Args>
    shared_ptr<T> allocate_shared(const A& a, Args&&... args);
  // 20.9.11.2.7, shared_ptr comparisons:
  template<class T, class U>
    bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
  template<class T, class U>
    bool operator!=(const shared_ptr<T>& a, const shared_ptr<U>& b);
  template<class T, class U>
    bool operator<(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
  // 20.9.11.2.8, shared_ptr I/O:
  template<class E, class T, class Y>
    basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, const shared_ptr<Y>& p);
  // 20.9.11.2.9, shared_ptr specialized algorithms:
  template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
  // 20.9.11.2.10, shared_ptr casts:
  template<class T, class U>
    shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;
  template<class T, class U>
    shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept;
  // 20.9.11.2.11, shared_ptr get_deleter:
  template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;
} // namespace std
Before p. 1
constexpr shared_ptr() noexcept;
3 Throws: nothing.
After p. 13
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
16 Throws: nothing.
After p. 18
shared_ptr(const shared_ptr& r) noexcept; template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
22 Throws: nothing.
After p. 22
shared_ptr(shared_ptr&& r) noexcept; template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
26 Throws: nothing.
Before p. 1
~shared_ptr() noexcept;
2 Throws: nothing.
Before p. 1
void swap(shared_ptr& r) noexcept;
2 Throws: nothing.
Before p. 1
T* get() const noexcept;
2 Throws: nothing.
After p. 2
T& operator*() const noexcept;
5 Throws: nothing.
After p. 6
T* operator->() const noexcept;
9 Throws: nothing.
After p. 9
long use_count() const noexcept;
11 Throws: nothing.
After p. 12
bool unique() const noexcept;
14 Throws: nothing.
After p. 15
explicit operator bool() const noexcept;
17 Throws: nothing.
Before p. 1
template<class T, class U> bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
2 Throws: nothing.
After p. 2
template<class T, class U> bool operator<(const shared_ptr<T>& a, const shared_ptr<U>& b) noexcept;
4 Throws: nothing.
Before p. 1
template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
2 Throws: nothing.
Before p. 1
template<class T, class U> shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept;
4 Throws: nothing.
After p. 5
template<class T, class U> shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;
9 Throws: nothing.
After p. 10
template<class T, class U> shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept;
14 Throws: nothing.
Before p. 1
template<class D, class T> D* get_deleter(const shared_ptr<T>& p) noexcept;
2 Throws: nothing.
Before p. 1
namespace std {
  template<class T> class weak_ptr {
  public:
    typedef T element_type;
    // constructors
    constexpr weak_ptr() noexcept;
    template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept;
    weak_ptr(weak_ptr const& r) noexcept;
    template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept;
    // destructor
    ~weak_ptr() noexcept;
    // assignment
    weak_ptr& operator=(weak_ptr const& r) noexcept;
    template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept;
    template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept;
    // modifiers
    void swap(weak_ptr& r) noexcept;
    void reset();
    // observers
    long use_count() const noexcept;
    bool expired() const noexcept;
    shared_ptr<T> lock() const noexcept;
    template<class U> bool owner_before(shared_ptr<U> const& b);
    template<class U> bool owner_before(weak_ptr<U> const& b);
  };
  // specialized algorithms
  template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
} // namespace std
Before p. 1
constexpr weak_ptr() noexcept;
3 Throws: nothing.
After p. 3
weak_ptr(const weak_ptr& r) noexcept; template<class Y> weak_ptr(const weak_ptr<Y>& r) noexcept; template<class Y> weak_ptr(const shared_ptr<Y>& r) noexcept;
7 Throws: nothing.
Before p. 1
~weak_ptr() noexcept;
2 Throws: nothing.
Before p. 1
weak_ptr& operator=(const weak_ptr& r) noexcept; template<class Y> weak_ptr& operator=(const weak_ptr<Y>& r) noexcept; template<class Y> weak_ptr& operator=(const shared_ptr<Y>& r) noexcept;
2 Throws: nothing.
Before p. 1
void swap(weak_ptr& r) noexcept;
2 Throws: nothing.
Before p. 1
long use_count() const noexcept;
2 Throws: nothing.
After p. 3
bool expired() const noexcept;
5 Throws: nothing.
After p. 6
shared_ptr<T> lock() const noexcept;
8 Throws: nothing.
Before p. 1
template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
2 Throws: nothing.
After p. 2
namespace std {
  template<class T> class enable_shared_from_this {
  protected:
    constexpr enable_shared_from_this() noexcept;
    enable_shared_from_this(enable_shared_from_this const&) noexcept;
    enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept;
    ~enable_shared_from_this() noexcept;
  public:
    shared_ptr<T> shared_from_this();
    shared_ptr<T const> shared_from_this() const;
  };
} // namespace std
After p. 3
constexpr enable_shared_from_this() noexcept; enable_shared_from_this(const enable_shared_from_this<T>&) noexcept;
5 Throws: nothing.
After p. 5
enable_shared_from_this<T>& operator=(const enable_shared_from_this<>>&) noexcept;
7 Throws: nothing.
After p. 7
~enable_shared_from_this() noexcept;
9 Throws: nothing.
After p. 2
template<class T> bool atomic_is_lock_free(const shared_ptr<T>* p) noexcept;
5 Throws: nothing.
After p. 7
template<class T> shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo) noexcept;
11 Throws: nothing.
After p. 13
template<class T> void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo) noexcept;
17 Throws: nothing.
After p. 19
template<class T>
  shared_ptr<T> atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r,
                                         memory_order mo) noexcept;
23 Throws: nothing.
After p. 26
template<class T>
  bool atomic_compare_exchange_weak_explicit(
    shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
    memory_order success, memory_order failure) noexcept;
template<class T>
  bool atomic_compare_exchange_strong_explicit(
    shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w,
    memory_order success, memory_order failure) noexcept;
31 Throws: nothing.
After p. 4
template <class T> T *undeclare_reachable(T *p) noexcept;
7 Throws: nothing.
After p. 8
void declare_no_pointers(char *p, size_t n) noexcept;
11 Throws: nothing.[ Note: Under some conditions implementations may need to allocate memory.
However, the request can be ignored if memory allocation fails. —end note ]
After p. 11
void undeclare_no_pointers(char *p, size_t n) noexcept;
14 Throws: nothing.
After p. 14
pointer_safety get_pointer_safety() noexcept;
16 Throws: Nothing.
After p. 5
namespace std {
  template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
  class basic_string {
  public:
...
    basic_string& operator=(basic_string&& str) noexcept;
...
    // 21.4.4 capacity:
    size_type size() const noexcept;
...
    // 21.4.5 element access:
    const_reference operator[](size_type pos) const noexcept;
    reference operator[](size_type pos) noexcept;
...
    basic_string& assign(basic_string&& str) noexcept;
...
    void swap(basic_string& str) noexcept;
...
    // 21.4.7 string operations:
    const charT* c_str() const noexcept; // explicit
    const charT* data() const noexcept;    
...
  };
After p. 20
basic_string<charT,traits,Allocator>& operator=(basic_string<charT,traits,Allocator>&& str) noexcept;
23 Throws: Nothing.
Before p. 1
size_type size() const noexcept;
2 Throws: nothing.
Before p. 1
const_reference operator[](size_type pos) const noexcept; reference operator[](size_type pos) noexcept;
3 Throws: nothing.
After p. 2
basic_string& assign(basic_string&& str) noexcept;
3 Throws: nothing.
Before p. 1
void swap(basic_string<charT,traits,Allocator>& s) noexcept;
1 Throws: Nothing.
Before p. 1
const charT* c_str() const noexcept; const charT* data() const noexcept;
2 Throws: nothing.
After p. 1
namespace std {
#include <initializer_list>
...
  template <size_t I, class T, size_t N>
    T& get(array<T, N>&) noexcept;
  template <size_t I, class T, size_t N>
    const T& get(const array<T, N>&) noexcept;
}
After p. 4
template <size_t I, class T, size_t N> T& get(array<T, N>& a) noexcept;
7 Throws: nothing.
After p. 7
template <size_t I, class T, size_t N> const T& get(const array<T, N>& a) noexcept;
10 Throws: nothing.
After p. 3
namespace std {
  template <class T, class Allocator = allocator<T> >
  class forward_list {
  public:
...  
    iterator erase_after(const_iterator position) noexcept;
    iterator erase_after(const_iterator position, iterator last) noexcept;
...
    // 23.3.3.5 forward_list operations:
    void splice_after(const_iterator position, forward_list<T,Allocator>&& x) noexcept;
    void splice_after(const_iterator position, forward_list<T,Allocator>&& x,
                      const_iterator i) noexcept;
...
    void reverse() noexcept;
  };
...
}
After p. 18
iterator erase_after(const_iterator position) noexcept;
22 Throws: Nothing.
After p. 22
iterator erase_after(const_iterator position, iterator last) noexcept;
26 Throws: Nothing.
Before p. 1
void splice_after(const_iterator position, forward_list<T,Allocator>&& x) noexcept;
3 Throws: Nothing.
After p. 4
void splice_after(const_iterator position, forward_list<T,Allocator>&& x, const_iterator i) noexcept;
7 Throws: Nothing.
After p. 23
void reverse() noexcept;
25 Throws: Nothing.
After p. 2
namespace std {
  template <class T, class Allocator = allocator<T> >
  class list {
  public:
...
    void pop_front() noexcept;
...
    void pop_back() noexcept;
...
    iterator erase(const_iterator position) noexcept;
    iterator erase(const_iterator first, const_iterator last) noexcept;
...
    void clear() noexcept;
    // 23.3.4.4 list operations:
    void splice(const_iterator position, list<T,Allocator>& x) noexcept;
    void splice(const_iterator position, list<T,Allocator>&& x) noexcept;
    void splice(const_iterator position, list<T,Allocator>& x, const_iterator i) noexcept;
    void splice(const_iterator position, list<T,Allocator>&& x, const_iterator i) noexcept;
    void splice(const_iterator position, list<T,Allocator>& x,
                const_iterator first, const_iterator last) noexcept;
    void splice(const_iterator position, list<T,Allocator>&& x,
                const_iterator first, const_iterator last) noexcept;
...
    void reverse() noexcept;
  };
...
}
After p. 2
iterator erase(const_iterator position) noexcept; iterator erase(const_iterator first, const_iterator last) noexcept; void pop_front() noexcept; void pop_back() noexcept; void clear() noexcept;
4 Throws: Nothing.
After p. 2
void splice(const_iterator position, list<T,Allocator>& x) noexcept; void splice(const_iterator position, list<T,Allocator>&& x) noexcept;
5 Throws: Nothing
After p. 6
void splice(const_iterator position, list<T,Allocator>& x, const_iterator i) noexcept; void splice(const_iterator position, list<T,Allocator>&& x, const_iterator i) noexcept;
8 Throws: Nothing
After p. 10
void splice(const_iterator position, list<T,Allocator>& x, const_iterator first,
            const_iterator last) noexcept;
void splice(const_iterator position, list<T,Allocator>&& x, const_iterator first,
            const_iterator last) noexcept;
13 Throws: Nothing
After p. 25
void reverse() noexcept;
27 Throws: Nothing
After p. 2
namespace std {
  template <class T, class Allocator = allocator<T> >
  class vector {
  public:
...
    // 23.4.1.3 data access
    T* data() noexcept;
    const T* data() const noexcept;
...
  };
...
}
Before p. 1
T* data() noexcept; const T* data() const noexcept;
3 Throws: Nothing.
After p. 2
class random_device
{
public:
  // types
  typedef unsigned int result_type;
  // generator characteristics
  static constexpr result_type min() { return numeric_limits<result_type>::min(); }
  static constexpr result_type max() { return numeric_limits<result_type>::max(); }
  // constructors
  explicit random_device(const string& token = implementation-defined);
  // generating functions
  result_type operator()();
  // property functions
  double entropy() const noexcept;
  // no copy functions
  random_device(const random_device& ) = delete;
  void operator=(const random_device& ) = delete;
};
After p. 4
double entropy() const noexcept;
namespace std {
  template<class T> class valarray {
  public:
...
    valarray(valarray&&) noexcept;
...
    valarray<T>& operator=(valarray<T>&&) noexcept;
...
    // 26.6.2.7 member functions:
    void swap(valarray&) noexcept;
...
  };
}
After p. 5
valarray(valarray<T>&& v) noexcept;
8 Throws: Nothing.
After p. 2
valarray<T>& operator=(valarray<T>&& v) noexcept;
5 Throws: Nothing.
Before p. 1
void swap(valarray& v) noexcept;
3 Throws: Nothing.
Before p. 1
namespace std {
  template <class charT, class traits = char_traits<charT> >
  class basic_ios : public ios_base {
  public:
...
    void swap(basic_ios& rhs) noexcept;
    void set_rdbuf(basic_streambuf<charT, traits>* sb) noexcept;
  };
}
After p. 20
void swap(basic_ios& rhs) noexcept;
22 Throws: Nothing.
After p. 22
void set_rdbuf(basic_streambuf<charT, traits>* sb) noexcept;
25 Throws: Nothing.
Before p. 1
namespace std {
  template <class charT,class traits = char_traits<charT> >
  class basic_ostream<charT,traits>::sentry {
    bool ok_; // exposition only
  public:
    explicit sentry(basic_ostream<charT,traits>& os);
    ~sentry() noexcept;
    explicit operator bool() const { return ok_; }
    sentry(const sentry&) = delete;
    sentry& operator=(const sentry&) = delete;
  };
}
After p. 3
~sentry() noexcept;
After p. 4
Throws: Nothing.
After p. 3
namespace std {
  template <class charT,
               class traits = regex_traits<charT> >
  class basic_regex {
  public:
...
    basic_regex(basic_regex&&) noexcept;
...
    basic_regex& assign(basic_regex&& that) noexcept;
...
  };
}
After p. 11
basic_regex(basic_regex&& e) noexcept;
14 Throws: nothing.
After p. 8
basic_regex& assign(basic_regex&& that) noexcept;
11 Throws: nothing.
After p. 3
namespace std {
  template <class BidirectionalIterator,
               class Allocator = allocator<sub_match<BidirectionalIterator> >
  class match_results {
  public:
...
    match_results& operator=(match_results&& m) noexcept;
...
  };
}
After p. 7
match_results& operator=(match_results&& m) noexcept;
9 Throws: Nothing.
After p. 1
namespace std {
  class thread {
  public:
    // types:
    class id;
    typedef implementation-defined native_handle_type; // See 30.2.3
    // construct/copy/destroy:
    thread() noexcept;
    template <class F, class ...Args> explicit thread(F&& f, Args&&... args);
    ~thread() noexcept;
    thread(const thread&) = delete;
    thread(thread&&) noexcept;
    thread& operator=(const thread&) = delete;
    thread& operator=(thread&&) noexcept;
    // members:
    void swap(thread&) noexcept;
    bool joinable() const noexcept;
    void join();
    void detach();
    id get_id() const noexcept;
    native_handle_type native_handle(); // See 30.2.3
    // static members:
    static unsigned hardware_concurrency() noexcept;
  };
}
Before p. 1
namespace std {
  class thread::id {
  public:
    id() noexcept;
  };
  bool operator==(thread::id x, thread::id y) noexcept;
  bool operator!=(thread::id x, thread::id y) noexcept;
  bool operator<(thread::id x, thread::id y) noexcept;
  bool operator<=(thread::id x, thread::id y) noexcept;
  bool operator>(thread::id x, thread::id y) noexcept;
  bool operator>=(thread::id x, thread::id y) noexcept;
  template<class charT, class traits>
    basic_ostream<charT, traits>&
      operator<< (basic_ostream<charT, traits>& out, thread::id id);
  // Hash support
  template <class T> struct hash;
  template <> struct hash<thread::id>;
}
After p. 3
id() noexcept;
5 Throws: Nothing
After p. 6
bool operator==(thread::id x, thread::id y) noexcept;.
8 Throws: Nothing
After p. 8
bool operator!=(thread::id x, thread::id y) noexcept;
10 Throws: Nothing
After p. 10
bool operator<(thread::id x, thread::id y) noexcept;
12 Throws: Nothing
After p. 12
bool operator<=(thread::id x, thread::id y) noexcept;
14 Throws: Nothing
After p. 14
bool operator>(thread::id x, thread::id y) noexcept;
16 Throws: Nothing
After p. 16
bool operator>=(thread::id x, thread::id y) noexcept;
18 Throws: Nothing
Before p. 1
thread() noexcept;
3 Throws: Nothing.
After p. 9
thread(thread&& x); noexcept
12 Throws: Nothing.
Before p. 1
~thread() noexcept;
1 Throws: Nothing.
Before p. 1
thread& operator=(thread&& x) noexcept;
1 Throws: Nothing.
Before p. 1
void swap(thread& x) noexcept;
2 Throws: Nothing.
After p. 2
bool joinable() const noexcept;
4 Throws: Nothing.
After p. 15
id get_id() const noexcept;
17 Throws: Nothing.
Before p. 1
unsigned hardware_concurrency() noexcept;
2 Throws: Nothing.
Before p. 1
namespace std {
  namespace this_thread {
    thread::id get_id() noexcept;
    void yield() noexcept;
    template <class Clock, class Duration>
      void sleep_until(const chrono::time_point<Clock, Duration>& abs_time) noexcept;
    template <class Rep, class Period>
      void sleep_for(const chrono::duration<Rep, Period>& rel_time) noexcept;
  }
}
thread::id this_thread::get_id() noexcept;
2 Throws: Nothing.
After p. 2
void this_thread::yield() noexcept;
5 Throws: Nothing.
After p. 5
template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time) noexcept;
8 Throws: Nothing.
After p. 8
template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time) noexcept;
11 Throws: Nothing.
After p. 1
namespace std {
...
  struct once_flag {
    constexpr once_flag() noexcept;
    once_flag(const once_flag&) = delete;
    once_flag& operator=(const once_flag&) = delete;
  };
...
}
18Throws: NothingThe expression noexcept(m.try_lock()) shall evaluate to true.
24Throws: NothingThe expression noexcept(m.unlock()) shall evaluate to true.
Before p. 1
namespace std {
  class mutex {
  public:
    constexpr mutex();
    ~mutex();
    mutex(const mutex&) = delete;
    mutex& operator=(const mutex&) = delete;
    void lock();
    bool try_lock() noexcept;
    void unlock() noexcept;
    typedef implementation-defined native_handle_type; // See 30.2.3
    native_handle_type native_handle(); // See 30.2.3
  };
}
namespace std {
  class recursive_mutex {
  public:
    recursive_mutex();
    ~recursive_mutex();
    recursive_mutex(const recursive_mutex&) = delete;
    recursive_mutex& operator=(const recursive_mutex&) = delete;
    void lock();
    bool try_lock() noexcept;
    void unlock() noexcept;
    
    typedef implementation-defined native_handle_type; // See 30.2.3
    native_handle_type native_handle(); // See 30.2.3
  };
}
8Throws: Nothing.The expression noexcept(m.try_lock_for(rel_time)) shall evaluate to true.
14Throws: Nothing.The expression noexcept(m.try_lock_until(abs_time)) shall evaluate to true.
Before p. 1
namespace std {
  class timed_mutex {
  public:
    timed_mutex();
    ~timed_mutex();
    timed_mutex(const timed_mutex&) = delete;
    timed_mutex& operator=(const timed_mutex&) = delete;
    
    void lock();
    bool try_lock();
    template <class Rep, class Period>
      bool try_lock_for(const chrono::duration<Rep, Period>& rel_time) noexcept;
    template <class Clock, class Duration>
      bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time) noexcept;
    void unlock();
    typedef implementation-defined native_handle_type; // See 30.2.3
    native_handle_type native_handle(); // See 30.2.3
  };
}
Before p. 1
namespace std {
  class recursive_timed_mutex {
  public:
    recursive_timed_mutex();
    ~recursive_timed_mutex();
    
    recursive_timed_mutex(const recursive_timed_mutex&) = delete;
    recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete;
    void lock();
    bool try_lock();
    template <class Rep, class Period>
      bool try_lock_for(const chrono::duration<Rep, Period>& rel_time) noexcept;
    template <class Clock, class Duration>
      bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time) noexcept;
    void unlock();
    
    typedef implementation-defined native_handle_type; // See 30.2.3
    native_handle_type native_handle(); // See 30.2.3
  };
}
Before p. 1
namespace std {
  template <class Mutex>
  class lock_guard {
  public:
    typedef Mutex mutex_type;
    explicit lock_guard(mutex_type& m);
    lock_guard(mutex_type& m, adopt_lock_t) noexcept;
    ~lock_guard() noexcept;
    lock_guard(lock_guard const&) = delete;
    lock_guard& operator=(lock_guard const&) = delete;
  private:
    mutex_type& pm; // exposition only
  };
}
After p. 4
lock_guard(mutex_type& m, adopt_lock_t) noexcept;
7 Throws: Nothing.
After p. 7
~lock_guard() noexcept;
9 Throws: Nothing.
Before p. 1
namespace std {
  template <class Mutex>
  class unique_lock {
  public:
    typedef Mutex mutex_type;
    // 30.4.3.2.1 construct/copy/destroy
    unique_lock() noexcept;
    explicit unique_lock(mutex_type& m);
    unique_lock(mutex_type& m, defer_lock_t) noexcept;
    unique_lock(mutex_type& m, try_to_lock_t) noexcept;
    unique_lock(mutex_type& m, adopt_lock_t) noexcept;
    template <class Clock, class Duration>
      unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time) noexcept;
    template <class Rep, class Period>
      unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time) noexcept;
    ~unique_lock() noexcept;
    unique_lock(unique_lock const&) = delete;
    unique_lock& operator=(unique_lock const&) = delete;
    unique_lock(unique_lock&& u) noexcept;
    unique_lock& operator=(unique_lock&& u) noexcept;
    // 30.4.3.2.2 locking
    void lock();
    bool try_lock();
    template <class Rep, class Period>
      bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
    template <class Clock, class Duration>
      bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
    void unlock();
    // 30.4.3.2.3 modifiers
    void swap(unique_lock& u) noexcept;
    mutex_type *release() noexcept;
    // 30.4.3.2.4 observers
    bool owns_lock() const noexcept;
    explicit operator bool () const noexcept;
    mutex_type* mutex() const noexcept;
  private:
    mutex_type *pm; // exposition only
    bool owns; // exposition only
  };
  template <class Mutex>
    void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept;
}
Before p. 1
unique_lock() noexcept;
3 Throws: Nothing.
After p. 6
unique_lock(mutex_type& m, defer_lock_t) noexcept;
9 Throws: Nothing.
After p. 9
unique_lock(mutex_type& m, try_to_lock_t) noexcept;
13 Throws: Nothing.
After p. 13
unique_lock(mutex_type& m, adopt_lock_t) noexcept;
17 Throws: Nothing.
After p. 17
template <class Clock, class Duration> unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time) noexcept;
21 Throws: Nothing.
After p. 21
template <class Rep, class Period> unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time) noexcept;
25 Throws: Nothing.
After p. 25
unique_lock(unique_lock&& u) noexcept;
27 Throws: Nothing.
After p. 27
unique_lock& operator=(unique_lock&& u) noexcept;
30 Throws: Nothing.
After p. 30
~unique_lock() noexcept;
33 Throws: Nothing.
Before p. 1
void swap(unique_lock& u) noexcept;
2 Throws: Nothing.
After p. 2
mutex_type *release() noexcept;
5 Throws: Nothing.
After p. 5
template <class Mutex> void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept;
7 Throws: Nothing.
Before p. 1
bool owns_lock() const noexcept;
2 Throws: Nothing.
After p. 2
explicit operator bool() const noexcept;
4 Throws: Nothing.
After p. 4
mutex_type *mutex() const noexcept;
6 Throws: Nothing.
Before p. 1
constexpr once_flag() noexcept;
4 Throws: nothing.
Before p. 1
namespace std {
  class condition_variable {
  public:
    condition_variable();
    ~condition_variable() noexcept;  
...
    void notify_one() noexcept;
    void notify_all() noexcept;
...
  };
}
After p. 4
~condition_variable() noexcept;
7 Throws: nothing.
After p. 7
void notify_one() noexcept;
9 Throws: nothing.
After p. 9
void notify_all() noexcept;
11 Throws: nothing.
After p. 1
namespace std {
  class condition_variable_any {
  public:
    condition_variable_any();
    ~condition_variable_any() noexcept;
...
    void notify_one() noexcept;
    void notify_all() noexcept;
...
  };
}After p. 2
~condition_variable_any() noexcept;
5 Throws: Nothing.
After p. 5
void notify_one() noexcept;
7 Throws: Nothing.
After p. 7
void notify_all() noexcept;
9 Throws: Nothing.
Before p. 1
namespace std {
  template <class R>
  class promise {
  public:
...
    promise(promise&& rhs) noexcept;
...
    // assignment
    promise& operator=(promise&& rhs) noexcept;
    promise& operator=(const promise& rhs) = delete;
    void swap(promise& other) noexcept;
...
  };
...
}
After p. 3
promise(promise&& rhs) noexcept;
6 Throws: Nothing.
After p. 7
promise& operator=(promise&& rhs) noexcept;
11 Throws: Nothing.
After p. 11
void swap(promise& other) noexcept;
14 Throws: Nothing.
After p. 3
namespace std {
  template <class R>
  class future {
  public:
    future();
    future(future &&) noexcept;
...
  };
}
After p. 6
future(future&& rhs) noexcept;
9 Throws: nothing.
After p. 3
namespace std {
  template <class R>
  class shared_future {
  public:
    shared_future() noexcept;
    shared_future(const shared_future& rhs);
    shared_future(future&&) noexcept;
    shared_future(shared_future&& rhs) noexcept;
...
};
}
 After p. 4
shared_future() noexcept;
7 Throws: Nothing.
After p. 9
shared_future(future<R>&& rhs) noexcept; shared_future(shared_future&& rhs) noexcept;
12 Throws: nothing.
After p. 3
namespace std {
  template<class> class packaged_task; // undefined
  
  template<class R, class... ArgTypes>
  class packaged_task<R(ArgTypes...)> {
  public:
    typedef R result_type;
    // construction and destruction
    packaged_task() noexcept;
    template <class F>
      explicit packaged_task(F f);
    template <class F, class Allocator>
      explicit packaged_task(allocator_arg_t, const Allocator& a, F f);
    explicit packaged_task(R(*f)(ArgTypes...));
    template <class F>
      explicit packaged_task(F&& f);
    template <class F, class Allocator>
      explicit packaged_task(allocator_arg_t, const Allocator& a, F&& f);
    ~packaged_task() noexcept;
    // no copy
    packaged_task(packaged_task&) = delete;
    packaged_task& operator=(packaged_task&) = delete;
    // move support
    packaged_task(packaged_task&& other) noexcept;
    packaged_task& operator=(packaged_task&& other);
    void swap(packaged_task& other) noexcept;
    
    explicit operator bool() const noexcept;
    // result retrieval
    future<R> get_future();
    // execution
    void operator()(ArgTypes... );
    void make_ready_at_thread_exit(ArgTypes...);
    void reset();
  };
  template <class R, class... ArgTypes>
    void swap(packaged_task<R(ArgTypes...)>& x, packaged_task<R(ArgTypes...)>& y) noexcept;
  template <class R, class Alloc>
    struct uses_allocator<packaged_task<R>, Alloc>;
}
Before p. 1
packaged_task() noexcept;
2 Throws: nothing.
After p. 5
packaged_task(packaged_task&& other) noexcept;
8 Throws: nothing.
After p. 9
~packaged_task() noexcept;
11 Throws: nothing.
After p. 11
void swap(packaged_task& other) noexcept;
14 Throws: nothing.
After p. 14
explicit operator bool() const noexcept;
16 Throws: nothing.
Before p. 1
template <class R, class... ArgTypes> void swap(packaged_task<R(ArgTypes...)>& x, packaged_task<R(ArgTypes...)>& y) noexcept;
2 Throws: Nothing.