Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   What's the standard say about this code? (http://www.velocityreviews.com/forums/t637667-whats-the-standard-say-about-this-code.html)

Daniel T. 09-30-2008 03:40 PM

What's the standard say about this code?
 
#include <cassert>

class Foo {
public:
virtual void fnA() = 0;
virtual void fnB() = 0;
};

int main() {
assert( &Foo::fnB );
assert( &Foo::fnA );
}

What does the standard say about the above code? In the compiler I'm
using now, the first assert will not fire, but the second one will. I
expected that neither assert would fire...


Maxim Yegorushkin 09-30-2008 03:53 PM

Re: What's the standard say about this code?
 
On Sep 30, 4:40*pm, "Daniel T." <danie...@earthlink.net> wrote:
> #include <cassert>
>
> class Foo {
> public:
> * * * * virtual void fnA() = 0;
> * * * * virtual void fnB() = 0;
>
> };
>
> int main() {
> * * * * assert( &Foo::fnB );
> * * * * assert( &Foo::fnA );
>
> }
>
> What does the standard say about the above code? In the compiler I'm
> using now, the first assert will not fire, but the second one will. I
> expected that neither assert would fire...


Are you sure that the second assert is failing?

Both &Foo::fnB and &Foo::fnA should yield a non-NULL member function
pointer, which gets converted to bool(true) when passed into assert().

--
Max




Daniel T. 09-30-2008 04:21 PM

Re: What's the standard say about this code?
 
On Sep 30, 11:53*am, Maxim Yegorushkin <maxim.yegorush...@gmail.com>
wrote:
> On Sep 30, 4:40*pm, "Daniel T." <danie...@earthlink.net> wrote:
>
>
>
> > #include <cassert>

>
> > class Foo {
> > public:
> > * * * * virtual void fnA() = 0;
> > * * * * virtual void fnB() = 0;

>
> > };

>
> > int main() {
> > * * * * assert( &Foo::fnB );
> > * * * * assert( &Foo::fnA );

>
> > }

>
> > What does the standard say about the above code? In the compiler I'm
> > using now, the first assert will not fire, but the second one will. I
> > expected that neither assert would fire...

>
> Are you sure that the second assert is failing?
>
> Both &Foo::fnB and &Foo::fnA should yield a non-NULL member function
> pointer, which gets converted to bool(true) when passed into assert().


Yes, I am sure that the second assert is failing. If this is a
compiler bug, then I will submit it to the vendor, but I want to make
sure it actually *is* a compiler bug first.


James Kanze 10-01-2008 08:56 AM

Re: What's the standard say about this code?
 
On Sep 30, 5:40 pm, "Daniel T." <danie...@earthlink.net> wrote:
> #include <cassert>


> class Foo {
> public:
> virtual void fnA() = 0;
> virtual void fnB() = 0;
> };


> int main() {
> assert( &Foo::fnB );
> assert( &Foo::fnA );
> }


> What does the standard say about the above code?


There should be no problem with it.

> In the compiler I'm using now, the first assert will not fire,
> but the second one will. I expected that neither assert would
> fire...


It's guaranteed by the standard. It works with the three
compilers I have access to (Sun CC, g++ and VC++), at least when
you compile in standard conformant mode. (Note that by default,
pointers to member functions do not work in VC++. You must use
the option /vmg. Not that I think that their non-conformity
otherwise would play a role here.)

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Triple-DES 10-01-2008 11:49 AM

Re: What's the standard say about this code?
 
On 1 Okt, 12:50, "Daniel T." <danie...@earthlink.net> wrote:
> James Kanze <james.ka...@gmail.com> wrote:
> > "Daniel T." <danie...@earthlink.net> wrote:
> > > #include <cassert>

>
> > > class Foo {
> > > public:
> > > * * * * virtual void fnA() = 0;
> > > * * * * virtual void fnB() = 0;
> > > };

>
> > > int main() {
> > > * * * * assert( &Foo::fnB );
> > > * * * * assert( &Foo::fnA );
> > > }

>
> > > What does the standard say about the above code?

>
> > There should be no problem with it.

>
> > > In the compiler I'm using now, the first assert will not fire,
> > > but the second one will. I expected that neither assert would
> > > fire...

>
> > It's guaranteed by the standard. *It works with the three
> > compilers I have access to (Sun CC, g++ and VC++), at least when
> > you compile in standard conformant mode. *(Note that by default,
> > pointers to member functions do not work in VC++. *You must use
> > the option /vmg. *Not that I think that their non-conformity
> > otherwise would play a role here.)

>
> Can I get chapter and verse from the standard on this? It sounds like I
> need to submit a bug report to the compiler vender.


I believe it is disallowed by 4.11/1 [conv.mem]:

"A null pointer constant (4.10) can be converted to a pointer to
member type; the result is the null member pointer value of that type
and is distinguishable from any pointer to member not created from a
null pointer constant.(...)"

Therefore, an rvalue obtained by using address-of on a member shall
not yield a null pointer constant.

> (For those who may be interested in tracking these things, I'm using
> CodeWarrior *Development Studio for NintendoDS)


Maxim Yegorushkin 10-01-2008 03:11 PM

Re: What's the standard say about this code?
 
On Oct 1, 12:49*pm, Triple-DES <DenPlettf...@gmail.com> wrote:
> On 1 Okt, 12:50, "Daniel T." <danie...@earthlink.net> wrote:
>
>
>
> > James Kanze <james.ka...@gmail.com> wrote:
> > > "Daniel T." <danie...@earthlink.net> wrote:
> > > > #include <cassert>

>
> > > > class Foo {
> > > > public:
> > > > * * * * virtual void fnA() = 0;
> > > > * * * * virtual void fnB() = 0;
> > > > };

>
> > > > int main() {
> > > > * * * * assert( &Foo::fnB );
> > > > * * * * assert( &Foo::fnA );
> > > > }

>
> > > > What does the standard say about the above code?

>
> > > There should be no problem with it.

>
> > > > In the compiler I'm using now, the first assert will not fire,
> > > > but the second one will. I expected that neither assert would
> > > > fire...

>
> > > It's guaranteed by the standard. *It works with the three
> > > compilers I have access to (Sun CC, g++ and VC++), at least when
> > > you compile in standard conformant mode. *(Note that by default,
> > > pointers to member functions do not work in VC++. *You must use
> > > the option /vmg. *Not that I think that their non-conformity
> > > otherwise would play a role here.)

>
> > Can I get chapter and verse from the standard on this? It sounds like I
> > need to submit a bug report to the compiler vender.

>
> I believe it is disallowed by 4.11/1 [conv.mem]:
>
> "A null pointer constant (4.10) can be converted to a pointer to
> member type; the result is the null member pointer value of that type
> and is distinguishable from any pointer to member not created from a
> null pointer constant.(...)"
>
> Therefore, an rvalue obtained by using address-of on a member shall
> not yield a null pointer constant.


In the original question a member function pointer gets converted to
bool. Is 4.11/1 applicable here?

--
Max

Erik Wikström 10-01-2008 05:14 PM

Re: What's the standard say about this code?
 
On 2008-10-01 17:11, Maxim Yegorushkin wrote:
> On Oct 1, 12:49 pm, Triple-DES <DenPlettf...@gmail.com> wrote:
>> On 1 Okt, 12:50, "Daniel T." <danie...@earthlink.net> wrote:
>>
>>
>>
>> > James Kanze <james.ka...@gmail.com> wrote:
>> > > "Daniel T." <danie...@earthlink.net> wrote:
>> > > > #include <cassert>

>>
>> > > > class Foo {
>> > > > public:
>> > > > virtual void fnA() = 0;
>> > > > virtual void fnB() = 0;
>> > > > };

>>
>> > > > int main() {
>> > > > assert( &Foo::fnB );
>> > > > assert( &Foo::fnA );
>> > > > }

>>
>> > > > What does the standard say about the above code?

>>
>> > > There should be no problem with it.

>>
>> > > > In the compiler I'm using now, the first assert will not fire,
>> > > > but the second one will. I expected that neither assert would
>> > > > fire...

>>
>> > > It's guaranteed by the standard. It works with the three
>> > > compilers I have access to (Sun CC, g++ and VC++), at least when
>> > > you compile in standard conformant mode. (Note that by default,
>> > > pointers to member functions do not work in VC++. You must use
>> > > the option /vmg. Not that I think that their non-conformity
>> > > otherwise would play a role here.)

>>
>> > Can I get chapter and verse from the standard on this? It sounds like I
>> > need to submit a bug report to the compiler vender.

>>
>> I believe it is disallowed by 4.11/1 [conv.mem]:
>>
>> "A null pointer constant (4.10) can be converted to a pointer to
>> member type; the result is the null member pointer value of that type
>> and is distinguishable from any pointer to member not created from a
>> null pointer constant.(...)"
>>
>> Therefore, an rvalue obtained by using address-of on a member shall
>> not yield a null pointer constant.

>
> In the original question a member function pointer gets converted to
> bool. Is 4.11/1 applicable here?


No, 4.12 is probably the correct section:

"An rvalue of arithmetic, enumeration, pointer, or pointer to member
type can be converted to an rvalue of type bool. A zero value, null
pointer value, or null member pointer value is converted to false; any
other value is converted to true."

--
Erik Wikström

Triple-DES 10-02-2008 05:26 AM

Re: What's the standard say about this code?
 
On 1 Okt, 19:14, Erik Wikström <Erik-wikst...@telia.com> wrote:
> On 2008-10-01 17:11, Maxim Yegorushkin wrote:
>
>
>
>
>
> > On Oct 1, 12:49 pm, Triple-DES <DenPlettf...@gmail.com> wrote:
> >> On 1 Okt, 12:50, "Daniel T." <danie...@earthlink.net> wrote:

>
> >> > James Kanze <james.ka...@gmail.com> wrote:
> >> > > "Daniel T." <danie...@earthlink.net> wrote:
> >> > > > #include <cassert>

>
> >> > > > class Foo {
> >> > > > public:
> >> > > > * * * * virtual void fnA() = 0;
> >> > > > * * * * virtual void fnB() = 0;
> >> > > > };

>
> >> > > > int main() {
> >> > > > * * * * assert( &Foo::fnB );
> >> > > > * * * * assert( &Foo::fnA );
> >> > > > }

>
> >> > > > What does the standard say about the above code?

>
> >> > > There should be no problem with it.

>
> >> > > > In the compiler I'm using now, the first assert will not fire,
> >> > > > but the second one will. I expected that neither assert would
> >> > > > fire...

>
> >> > > It's guaranteed by the standard. *It works with the three
> >> > > compilers I have access to (Sun CC, g++ and VC++), at least when
> >> > > you compile in standard conformant mode. *(Note that by default,
> >> > > pointers to member functions do not work in VC++. *You must use
> >> > > the option /vmg. *Not that I think that their non-conformity
> >> > > otherwise would play a role here.)

>
> >> > Can I get chapter and verse from the standard on this? It sounds like I
> >> > need to submit a bug report to the compiler vender.

>
> >> I believe it is disallowed by 4.11/1 [conv.mem]:

>
> >> "A null pointer constant (4.10) can be converted to a pointer to
> >> member type; the result is the null member pointer value of that type
> >> and is distinguishable from any pointer to member not created from a
> >> null pointer constant.(...)"

>
> >> Therefore, an rvalue obtained by using address-of on a member shall
> >> not yield a null pointer constant.

>
> > In the original question a member function pointer gets converted to
> > bool. Is 4.11/1 applicable here?

>
> No, 4.12 is probably the correct section:
>
> "An rvalue of arithmetic, enumeration, pointer, or pointer to member
> type can be converted to an rvalue of type bool. A zero value, null
> pointer value, or null member pointer value is converted to false; any
> other value is converted to true."
>


Of course, but the problem is that taking the address of a function
yields a null member pointer value, not the fact that it is
subsequently converted to false. The OP might as well have written:

assert( &Foo::fnB != 0);
assert( &Foo::fnA != 0);

And 4.12 would be completely irrelevant, but the result of the second
assert would still violate 4.11/1

DP


All times are GMT. The time now is 03:50 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57