On Feb 24, 2006, at 8:55 AM, Richard Guenther wrote:

On 2/24/06, Perry Smith <[EMAIL PROTECTED]> wrote:
I have asked this question before -- maybe to the gcc-help list but
I'm still unclear.

The problem is this:

struct foo {
     int a;
     int b;
     int c;
};

static const int foo::*j = &foo::c;                     // accepted

class dog {
     static const int foo::*k = &foo::c;        // error
};

5.19 (constant expressions) paragraph 2, the last item in the 1998 C+
+ spec says " -- a pointer to member constant expression."  That
appears to be defined as: '&' qualified-id (5.19 paragraph 6).

So is the line in error legal C++ or not?

No.

t.C:10: error: 'foo::c' cannot appear in a constant-expression
t.C:10: error: `&' cannot appear in a constant-expression
t.C:10: error: invalid in-class initialization of static data member
of non-integral type 'const int foo::*'

But '&' can occur in a constant-expression and 'foo::c' is a unique-id
which can also appear in a constant expression (see 5.19).  And as
far as the static const data member, 9.4.2 paragraph 4 says:

If a static data member is of const integral or const enumeration
type, its declaration in the class definition can specify a
constant-initializer which shall be an integral constant expression
(5.19). In that case, the member can appear in integral constant
expressions within its scope. The member shall still be defined in
a namespace scope if it is used in the program and the namespace
scope definition shall not con- tain an initializer.

Note that 5.19 states that '&foo::c' is an integral constant
expression.  So I draw the conclusion that k is a const integral
type (but I have not seen a place in the spec that actually says
that a pointer to member is an integral expression but what else
could it be?

Sorry to be a pest but I just don't see why my construct is excluded.

Thank you for your time and patience,
Perry

Reply via email to