Re: typedef, member function and const meat different compilers

From: Michiel Salters (Michiel.Salters_at_logicacmg.com)
Date: 05/13/04


Date: 13 May 2004 04:22:54 -0700

liesgotold@hotmail.com (joe) wrote in message news:<e65d679d.0405121402.298ec624@posting.google.com>...
> hi,
> after reading some articles and faq,
> i want to clarify myself what's correct(conform to standard) and
> what's not? or what should be correct but it isn't simply
> because compilers don't support.
> (first i compiled them with g++3.x. ERR means compiler will bark,
> otherwise it does accept it. Then the Comeau C/C++ 4.3.3 comes)
>
>
> //Q1===================================================//
> --g++
> typedef const int G(); //cv-qualified to int
> typedef int F(); //function type
>
> typedef const F H; //ERR, qualifier applied to function type means
> nothing
> typedef F const H; //what's it really? i don't know, but compiled with
> g++

F const equals const F, so g++ should complain on both.
 
> --Comeau
> "ComeauTest.c", line 1: warning: type qualifier on return type is
> meaningless
> typedef const int G();
> //well, different to what i think. what does std says?
> ^

Comeau is correct. The situation would be different when returning
a type with member functions. Basically, the int returned is a
temporary which must be copied before it can be used. Since copying
a const int doesn't differ from copying a non-const, the warning
is good - it points out something you didn't know.
 
> "ComeauTest.c", line 3: warning: type qualifiers on function types are
> ignored
> typedef const F H;
> ^
> "ComeauTest.c", line 4: warning: type qualifiers on function types are
> ignored
> typedef F const H;
> ^

Sure, the code is wrong, but the only restriction the standard imposes
is that the compiler must warn you. If it can continue, it is allowed to,
but it doesn't have to.

> //Q2====================================================//
> --g++
> typedef int (*F2)(); //ok, function pointer "int (*)()"
>
> the following two will be compiled by g++,
> but i think they are trivial(or, they shouldn't be compiled?)
> typedef const F2 H2; //qualifier applied to function pointer?
> typedef F2 const H3; //like the above

Sure. You can't modify a function, but you definitely can modify
a function pointer. Therefore, const qualifying a function
doesn't make sense, but const-qualifying a function pointer does.
Both H2 and H3 decalre function pointers that must be initialized
on declararation, and keep pointing to that same function during
their lifetimes.

> //Q3=======================================================//
> --g++
> class C;
> typedef int (C::*I)(); //a type of "int (C::*)()"
> typedef int (C::*J)() const; //const member func, a type of "int
> (C::*)() const"
>
> typedef int (C::K)(); //ERR, typedef names can't be class qualified
> well, seems reasonable to be ERR, but why?

I and J are member pointers, but there is no type int(C::)().
Therefore, you can't typedef K to that.
 
> //Q4==================================================//
> --g++
> compiled ok, but should they be compiled ok?
> class C;
> typedef int Q();
> typedef Q const C::* R1; //cv-qualified ptr?
> typedef Q C::* const R2; //like the above

No, read from R1 out. R1 is a pointer to member of C, and the member
has type Q const (which is ill-formed, Q is a function type)
Similar, R2 is a const pointer to member of C, and the member has
type Q.

Objects of type R1 can be changed, but cannot change what they point to
 ( except that Q const is ill formed).
Objects of type R2 cannot be changed, but can change what they point to
 ( except that you can't change functions )

> //--Comeau
> "ComeauTest.c", line 3: warning: type qualifiers on function types are
> ignored
> typedef Q const C::* R1;

Again, warning and then ignoring is a legal error handling strategy.

> //Q5======================================================//
> --g++
> typedef int M() const;
> ERR, invalid qualifier for non-member func type
> why? doesn't it implicitly expresses "int (someclass::*M)() const"
> and let us do the following:
>
> class A
> {
> M mf;
> };

No, not at all. M almost denotes a function type, but the const
doesn't make sense. What modification would it prevent?
Certainly a pointer to member is different from a function (the first
can be a simple numer, e.g. the third function in the vtable),
so you couldn't use it as a generic function pointer anyway.
 
> //Q6=====================================================//
> --g++
> class C
> {
> typedef int C::M3() const;
> typedef int M2() const; //ERR
> in a class can't we get things done like above?
> };

No, because 'int ()' is the type of a free function, even if written
within a class.

> --Comeau
> "ComeauTest.c", line 3: error: qualified name is not allowed in member
> declaration
> typedef int C::M3() const;
> ^

You can't typedef M3 to type 'member function', only
'pointer to member function'.

Quite a lot of the differences between free function types,
free function pointers and member function pointers are caused
by the need to be backwards compatible with C. It didn't have
member functions.

Regards,
Michiel Salters



Relevant Pages

  • Re: [C++]Template Function Pointer howto.
    ... > Even without the typedef, ... > do a template (non member) function pointer. ...
    (alt.comp.lang.learn.c-cpp)
  • Re: Simple question on Pointers
    ... Such a member is, of course, bad idea. ... declared as const SomeClass, this method exhibits undefined ... The code declares no such thing. ...
    (microsoft.public.vc.language)
  • Re: Simple question on Pointers
    ... Such a member is, of course, bad idea. ... const SomeClass, this method exhibits undefined behavior, but you won't ... your completely unambiguous declaration that m_iMember is, in fact, constant ...
    (microsoft.public.vc.language)
  • Re: Simple question on Pointers
    ... SomeClass* global = NULL; ... member function can be called on an object-expression only if the object-expression is as cv-qualified or less-cv-qualified than the member function.". ... It implies that "this" parameter of Memberpoints to a non-volatile object, but it can point to a const object, as well as ... Nobody expects that the standard will introduce undefined behavior, and after all it will define it or "say something about". ...
    (microsoft.public.vc.language)
  • [C++] Mutable member functions?
    ... I understand that a member function can be declared as const ... The store() method is ... So I would like to declare the ...
    (comp.lang.cpp)