Proposed resolution:
This wording is relative to N3797.
Change [meta.type.synop], header <type_traits> synopsis, as indicated
namespace std { […] // 20.10.4.3, type properties: […] template <class T> struct is_empty; template <class T> struct is_polymorphic; template <class T> struct is_abstract; template <class T> struct is_final; […] }
Change [meta.unary.prop], Table 49 — Type property predicates, as indicated
Template | Condition | Preconditions |
---|---|---|
template <class T> struct is_abstract; |
[…] | […] |
template <class T> struct is_final; |
T is a class type marked with the class-virt-specifier final ([class]).[Note: A union is a class type that can be marked with final . — end note]
|
If T is a class type, T shall be a complete type |
After [meta.unary.prop] p5 add one further example as indicated:
[Example:
// Given: struct P final { }; union U1 { }; union U2 final { }; // the following assertions hold: static_assert(!is_final<int>::value, "Error!"); static_assert( is_final<P>::value, "Error!"); static_assert(!is_final<U1>::value, "Error!"); static_assert( is_final<U2>::value, "Error!");— end example]