This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: pointer member constant expression



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


On 2/24/06, Perry Smith <pedz@easesoftware.net> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]