Date
2024-05-15.00:00:00
Message id
14129

Content

[ 2024-05-09; Jonathan provides wording ]

We could also relax the type completeness requirements for `reference_converts_from_temporary` and `reference_constructs_from_temporary`, as the result is always false if the first type is a non-reference, so we don't need complete types in that case. This doesn't seem important to support, but if we wanted to then we could say:

Either `T` is not a reference type, or `T` and `U` shall be a complete type complete types, cv `void`, or an arrayarrays of unknown bound.

This wording is relative to n4981.

  1. In [meta.unary.prop] Table 51, change the Preconditions text for `is_constructible`, `is_trivially_constructible`, `is_nothrow_constructible`, `is_convertible`, and `is_nothrow_convertible`, as indicated.
    TemplateConditionPreconditions
    template<class T, class... Args>
    struct is_constructible;
    For a function type `T` or for a cv `void` type `T`, is_constructible_v<T, Args...> is `false`, otherwise see below . Either `T` is a reference type and `Args` contains a single type that is similar ([conv.qual]) to remove_reference_t<T>, or `T` and all types in the template parameter pack `Args` shall be complete types, cv `void`, or arrays of unknown bound.
    template<class T, class... Args>
    struct is_trivially_constructible;
    is_constructible_v<T, Args...> is `true` and the variable definition for `is_constructible`, as defined below, is known to call no operation that is not trivial ([basic.types.general], [special]). Either `T` is a reference type and `Args` contains a single type that is similar ([conv.qual]) to remove_reference_t<T>, or `T` and all types in the template parameter pack `Args` shall be complete types, cv `void`, or arrays of unknown bound.
    template<class T, class... Args>
    struct is_nothrow_constructible;
    is_constructible_v<T, Args...> is `true` and the variable definition for `is_constructible`, as defined below, is known not to throw any exceptions ([expr.unary.noexcept]). Either `T` is a reference type and `Args` contains a single type that is similar ([conv.qual]) to remove_reference_t<T>, or `T` and all types in the template parameter pack `Args` shall be complete types, cv `void`, or arrays of unknown bound.
  2. In [meta.rel] Table 53, change the Comments text for `is_convertible` and `is_nothrow_convertible` as indicated.
    TemplateConditionComments
    template<class From, class To>
    struct is_convertible;
    see below Either `To` is a reference type and `From` is similar ([conv.qual]) to remove_reference_t<To>, or `From` and `To` shall be complete types, cv `void`, or arrays of unknown bound.
    template<class From, class To>
    struct is_nothrow_convertible;
    is_convertible_v<From, To> is `true` and the conversion, as defined by `is_convertible`, is known not to throw any exceptions ([expr.unary.noexcept]). Either `To` is a reference type and `From` is similar ([conv.qual]) to remove_reference_t<To>, or `From` and `To` shall be complete types, cv `void`, or arrays of unknown bound.