This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of CD1 status.

### 749. Currently `has_nothrow_copy_constructor<T>::value` is true if `T` has 'a' nothrow copy constructor.

Section: 21.3.5.4 [meta.unary.prop] Status: CD1 Submitter: Alisdair Meredith Opened: 2007-10-10 Last modified: 2016-01-28

Priority: Not Prioritized

View other active issues in [meta.unary.prop].

View all other issues in [meta.unary.prop].

View all issues with CD1 status.

Discussion:

Unfortunately a class can have multiple copy constructors, and I believe to be useful this trait should only return true is ALL copy constructors are no-throw.

For instance:

>     struct awkward {
>      awkward( const awkward & ) throw() {}
>      awkward( awkward & ) { throw "oops"; } };

Proposed resolution:

Change 21.3.5.4 [meta.unary.prop]:

>     has_trivial_copy_constructor

> > `T` is a trivial type (3.9) or a reference type or a class type with a trivial copy constructor where all copy constructors are trivial (12.8).

>     has_trivial_assign

> > `T` is neither `const` nor a reference type, and `T` is a trivial type (3.9) or a class type with a trivial copy assignment operator where all copy assignment operators are trivial (12.8).

>     has_nothrow_copy_constructor

> > `has_trivial_copy_constructor<T>::value` is `true` or `T` is a class type with a where all copy constructors that is are known not to throw any exceptions or `T` is an array of such a class type

>     has_nothrow_assign

> > `T` is neither `const` nor a reference type, and `has_trivial_assign<T>::value` is `true` or `T` is a class type with a where all copy assignment operators take ing an lvalue of type `T` that is known not to throw any exceptions or `T` is an array of such a class type.