How does dereferencing of a function pointer happen?

前端 未结 5 759
忘掉有多难
忘掉有多难 2020-11-22 07:58

Why and how does dereferencing a function pointer just \"do nothing\"?

This is what I am talking about:

#include

void hello() { print         


        
5条回答
  •  感情败类
    2020-11-22 08:30

    C++03 §4.3/1:

    An lvalue of function type T can be converted to an rvalue of type “pointer to T.” The result is a pointer to the function.

    If you attempt an invalid operation on a function reference, such as the unary * operator, the first thing the language tries is a standard conversion. It's just like converting an int when adding it to a float. Using * on a function reference causes the language to take its pointer instead, which in your example, is square 1.

    Another case where this applies is when assigning a function pointer.

    void f() {
        void (*recurse)() = f; // "f" is a reference; implicitly convert to ptr.
        recurse(); // call operator is defined for pointers
    }
    

    Note that this doesn't work the other way.

    void f() {
        void (&recurse)() = &f; // "&f" is a pointer; ERROR can't convert to ref.
        recurse(); // OK - call operator is *separately* defined for references
    }
    

    Function reference variables are nice because they (in theory, I've never tested) hint to the compiler that an indirect branch may be unnecessary, if initialized in an enclosing scope.

    In C99, dereferencing a function pointer yields a function designator. §6.3.2.1/4:

    A function designator is an expression that has function type. Except when it is the operand of the sizeof operator or the unary & operator, a function designator with type ‘‘function returning type’’ is converted to an expression that has type ‘‘pointer to function returning type’’.

    This is more like Norman's answer, but notably C99 has no concept of rvalues.

提交回复
热议问题