Skip to content

[meta.member] Comments for static_assert failures are incorrect #8240

Description

@frederick-vs-ja

Currently, the example reads:

struct A { int a; };                    // a standard-layout class
struct B { int b; };                    // a standard-layout class
struct C: public A, public B { };       // not a standard-layout class

static_assert( is_pointer_interconvertible_with_class( &C::b ) );
  // Succeeds because, despite its appearance, &C​::​b has type
  // “pointer to member of B of type int''.
static_assert( is_pointer_interconvertible_with_class<C>( &C::b ) );
  // Forces the use of class C, and fails.

static_assert( is_corresponding_member( &C::a, &C::b ) );
  // Succeeds because, despite its appearance, &C​::​a and &C​::​b have types
  // “pointer to member of A of type int'' and
  // “pointer to member of B of type int'', respectively.
static_assert( is_corresponding_member<C, C>( &C::a, &C::b ) );
  // Forces the use of class C, and fails.

However, the failures are because is_pointer_interconvertible_with_class<C>( &C::b ) and is_corresponding_member<C, C>( &C::a, &C::b ) are themselves ill-formed, not false results. In microsoft/STL#5730, it was noticed that given int A::* or int B::* argument values and manually specification of template arguments to C, the deduction failed despite that there can be implicit conversions.

I think we can fix the example by (demo)

-static_assert( is_pointer_interconvertible_with_class<C>( &C::b ) );
- // Forces the use of class C, and fails.
+static_assert( !is_pointer_interconvertible_with_class<C, int>( &C::b ) );
+ // Forces the use of class C, and the result is false.
-static_assert( is_corresponding_member<C, C>( &C::a, &C::b ) );
-  // Forces the use of class C, and fails.
+static_assert( !is_corresponding_member<C, C, int, int>( &C::a, &C::b ) );
+  // Forces the use of class C, and the result is false.

But I'm not sure whether this is desired. Also, do we want a CWG issue for this?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions