Topic: Address of member in class scope


Author: "=?iso-8859-1?q?Daniel_Kr=FCgler?=" <daniel.kruegler@googlemail.com>
Date: Wed, 21 Mar 2007 18:34:34 CST
Raw View
marwan.taher@gmail.com schrieb:

> Can someone tell me why the following code won't compile? I am taking
> the address of a class member within the class's declaration. This
> works for a pointer to member function, but fails for a pointer to
> data member. Is my compiler at fault? Or does the standard explicitly
> forbid this?

The standard does not explicitely forbid that. IMO the code
(commented or uncommented) is fine, therefore using
3.3.1/4 as reference, which says

"After the point of declaration of a class member, the member name
can be looked up in the scope of its class. [Note: this is true even
if
the class is an incomplete class. For example,
struct X {
enum E { z = 16 };
int b[X::z]; // OK
};
-end note]"

Additionally I also see no reasons why your example
should violate anyone of the requirements described
in 3.3.6 ([basic.scope.class]), especially not for

2) "A name N used in a class S shall refer to the same declaration
in its context and when re-evaluated in the completed scope of S.
No diagnostic is required for a violation of this rule."

or

3) "If reordering member declarations in a class yields an alternate
valid program under (1) and (2), the program is ill-formed, no
diagnostic is required."

I also observed that existing implementations differ here. E.g.
both Comeau and mingw 3.4 accept the code, but VS2005-SP1
rejects it (I guess you have tested the last one?).

Greetings from Bremen,

Daniel Kr   gler


---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]





Author: "jam" <farid.mehrabi@gmail.com>
Date: Thu, 22 Mar 2007 12:09:52 CST
Raw View
On Mar 22, 4:34 am, "Daniel Kr   gler" <daniel.krueg...@googlemail.com>
wrote:
> marwan.ta...@gmail.com schrieb:
>
> > Can someone tell me why the following code won't compile? I am taking
> > the address of a class member within the class's declaration. This
> > works for a pointer to member function, but fails for a pointer to
> > data member. Is my compiler at fault? Or does the standard explicitly
> > forbid this?
>
> The standard does not explicitely forbid that. IMO the code
> (commented or uncommented) is fine, therefore using
> 3.3.1/4 as reference, which says
>
> "After the point of declaration of a class member, the member name
> can be looked up in the scope of its class. [Note: this is true even
> if
> the class is an incomplete class. For example,
> struct X {
> enum E { z = 16 };
> int b[X::z]; // OK};
>
> -end note]"
>
> Additionally I also see no reasons why your example
> should violate anyone of the requirements described
> in 3.3.6 ([basic.scope.class]), especially not for
>
> 2) "A name N used in a class S shall refer to the same declaration
> in its context and when re-evaluated in the completed scope of S.
> No diagnostic is required for a violation of this rule."
>
> or
>
> 3) "If reordering member declarations in a class yields an alternate
> valid program under (1) and (2), the program is ill-formed, no
> diagnostic is required."
>
> I also observed that existing implementations differ here. E.g.
> both Comeau and mingw 3.4 accept the code, but VS2005-SP1
> rejects it (I guess you have tested the last one?).
>
> Greetings from Bremen,
>
> Daniel Kr   gler
>
> ---
> [ comp.std.c++ is moderated.  To submit articles, try just posting with ]
> [ your news-reader.  If that fails, use mailto:std-...@ncar.ucar.edu    ]
> [              --- Please see the FAQ before posting. ---               ]
> [ FAQ:http://www.comeaucomputing.com/csc/faq.html                     ]

multiple virtual inheitance postpones the calculation of data members`
address to runtime using dynamic typing and for this I guess that many
implementations assume all data member addresses to be evaluated at
runtime


---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]





Author: "=?iso-8859-1?q?Daniel_Kr=FCgler?=" <daniel.kruegler@googlemail.com>
Date: Fri, 23 Mar 2007 00:44:01 CST
Raw View
jam schrieb:

> multiple virtual inheitance postpones the calculation of data members`
> address to runtime using dynamic typing and for this I guess that many
> implementations assume all data member addresses to be evaluated at
> runtime

1) According to 14.3.2/1 a pointer to member is a valid argument
for a non-type template.

2) According to 5.19/2+4 we have the concept of a "pointer to
member constant expression":

"A pointer to member constant expression shall be created using
the unary & operator applied to a qualifiedid operand (5.3.1),
optionally preceded by a pointer to member cast (5.2.9)."

which is one of the valid components of a constant expression
capable to initialize a non-local static object. Exactly this kind of
initialization belongs to the static initializations occuring
*before*
dynamic initialization takes place.

Both (1) and (2) are *static* accesses to a pointer of member
and exactly this kind has been performed by the OP. This has
nothing to do with possible dynamic typing. Similarily I can
aquire the static address of a pure, virtual member function,
although those are usually known as pure incarnations of
runtime entities:

struct V {
  virtual ~V() = 0;
  virtual void foo() = 0;
};

template < void (V::*)() >
struct Tester {};

int main() {
  Tester<&V::foo>(); // No problem -> Static access
}

(Btw.: The above program compiles successfully for all
three compiler's tested in my previous posting, *even*
for VS2005-SP1)

Greetings from Bremen,

Daniel Kr   gler


---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]





Author: marwan.taher@gmail.com
Date: Mon, 19 Mar 2007 11:41:49 CST
Raw View
Can someone tell me why the following code won't compile? I am taking
the address of a class member within the class's declaration. This
works for a pointer to member function, but fails for a pointer to
data member. Is my compiler at fault? Or does the standard explicitly
forbid this?

struct Example
{
  // Template that takes a pointer to member function
  template<void (Example::*member)(int)>
    struct Command
    {
      void Set(Example& example, int value) { (example.*member)
(value); }
    };

  // Template that takes a pointer to data member
  template<int Example::*member>
    struct Property
    {
      void Set(Example& example, int value) { (example.*member) =
value; }
    };

  int value_;

  Example() : value_(0) {}

  int Get() const { return value_; }
  void Set(int value) { value_ = value; }

  // Can take an address of member function
  Command<&Example::Set> Setter;        // compiles...

  // Can NOT take an address of data member
  //Property<&Example::value_> Value;   // !!! WILL NOT COMPILE !!!

  // Can take an address of data member inside a function
  void SetValue(int value)
  {
    Property<&Example::value_> Value;   // compiles...
    Value.Set(*this, value);
  }
};

---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]