ejstans
10/28/2008 9:24:00 PM
On 28 Okt, 22:12, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
> Erik Wikström wrote:
> > On 2008-10-28 20:53, ejstans wrote:
> >> Hello,
>
> >> I encountered something unfamiliar to me today and I would like some
> >> clarifications. Unfortunately I don't have access to a standard but
> >> even if I did, I'm not even sure if I could understand it well enough
> >> to answer my question...
>
> >> Here's the deal: without instantiating the class, the code in question
> >> calls both static and non-static member functions like this:
>
> >> class foo {
> >> public:
> >> static void bar() { std::cout << "bar" << std::endl; }
> >> void bar2() { std::cout << "bar2" << std::endl; }
> >> };
>
> >> void
> >> func(foo* f)
> >> {
> >> f->bar();
> >> f->bar2();
> >> }
>
> >> int
> >> main()
> >> {
> >> func(NULL);
> >> return 0;
> >> }
>
> >> Is this allowed? And if it is, does a situation exist where it would
> >> be an advisable way of doing things?
>
> > No, this is not allowed. The reason it works is [..]
>
> <rant>
> The behaviour is undefined. Any attempt to explain why undefined
> behaviour actually creates an illusion (yes, an illusion) of a working
> program only contributes to the confusion. Now the OP might think,
> "it's OK if <blahblah>". But the actual mantra should be "no, it's not
> OK, ever". It's similar to "When/Why is it OK to point an unloaded
> weapon at your friend's head?" Well, it's NOT. Ever. So, the premise
> here ("it works") is wrong. It does NOT work. It's not defined to.
> </rant>
Heh! Thanks! I was after this kind of clear-cut answer; that's why I
persisted with the second question as to the actual "legality" of it,
unfortunately posted before I could see your reply.