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

### 3655. The `INVOKE` operation and `union` types

Section: 20.14.4 [func.require] Status: New Submitter: Jiang An Opened: 2021-12-29 Last modified: 2022-01-15

Priority: 3

View all other issues in [func.require].

View all issues with New status.

Discussion:

There are two cases of the `INVOKE` operation specified with `std::is_base_of_v` (20.14.4 [func.require] (1.1), (1,4)), which means the following code snippet is ill-formed, as `std::is_base_of_v<B, D>` is `false` when either `B` or `D` is a `union` type.

>     union Foo { int x; };
>     static_assert(std::is_invocable_v<int Foo::*, Foo&>);

Currently libstdc++ accepts this code, because it uses slightly different conditions that handle `union` types. libc++ and MSVC STL reject this code as specified in 20.14.4 [func.require].

Should we change the conditions in 20.14.4 [func.require] (1.1) and (1.4) to match libstdc++ and correctly handle `union` types?

[2022-01-30; Reflector poll]

Set priority to 3 after reflector poll.

Proposed resolution: