Search code examples
c++functionfunction-pointerstypedef

Why is there only pointer to function instead of var of function?


In C/C++, we can declare/define a type of pointer to function, and then declare/define some variables of this type. But I think it is ambiguity.

For example:

typedef void ( *pFunc )();
// typedef void ( aFunc )();
void theFunc() {
   cout << "theFunc has been called successfully." << endl;
};

int main() {
   pFunc pf0 = theFunc;
   pFunc pf1 = &theFunc;

   pf0();
   ( *pf0 )();
   pf1();
   ( *pf1 )();
};

Theoretically, only pFunc pf1 = &theFunc; and (*pf1)(); are legal, but all of above can pass through compilation.

In Pascal syntax, we need to define vars of function or vars of pointer to a function respectively, and the meaning of them are different and much clearer(at least I think so)!

Moreover, we can't declare/define a var of function instead of a var of pointer to function! I tried follows and get failed.

typedef void ( aFunc )();
aFunc af0 = theFunc;

If with other types such as int/double, there are very strict syntax that restricts us to use them correctly. (If int* is not same as int, why is *pf0 is same as pf0?!)

So, Can I think it is a bug of C/C++ standard?


Solution

  • I think that I have found the answer.

    Indeed c++ standard has offered a method to declare a type of function without the help of pointers.

    example:

    #include <functional>
    
    using AFunc_t = function<void( int )>;
    
    void theFunc( int );
    
    AFunc_t afunc = theFunc;
    

    I hope this could help someone.