747. We have 3 separate type traits to identify classes supporting no-throw operations

Section: 23.15.4.3 [meta.unary.prop] Status: NAD Submitter: Alisdair Meredith Opened: 2007-10-10 Last modified: 2016-02-10

Priority: Not Prioritized

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

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

View all issues with NAD status.

Discussion:

We have 3 separate type traits to identify classes supporting no-throw operations, which are very useful when trying to provide exception safety guarantees. However, I'm not entirely clear on what the current wording requires of a conforming implementation. To quote from has_nothrow_default_constructor:

or T is a class type with a default constructor that is known not to throw any exceptions

What level of magic do we expect to deduce if this is known?

E.g.

struct test{
 int x;
 test() : x() {}
};

Should I expect a conforming compiler to assert( has_nothrow_constructor<test>::value )

Is this a QoI issue?

Should I expect to 'know' only if-and-only-if there is an inline definition available?

Should I never expect that to be true, and insist that the user supplies an empty throw spec if they want to assert the no-throw guarantee?

It would be helpful to maybe have a footnote explaining what is required, but right now I don't know what to suggest putting in the footnote.

(agreement since is that trivial ops and explicit no-throws are required. Open if QoI should be allowed to detect further)

[ Bellevue: ]

This looks like a QoI issue. In the case of trivial and nothrow it is known. Static analysis of the program is definitely into QoI. Move to OPEN. Need to talk to Core about this.

[ 2009-07 Frankfurt: ]

This is QoI.

Move to NAD.

Proposed resolution: