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 takeing an lvalue of type T that is known not to throw any exceptions or T is an array of such a class type.