Could someone please explain the difference between a “reference” and a “pointer” in this case?

后端 未结 4 998
忘了有多久
忘了有多久 2020-12-19 09:34

When I read litb answer to this question, I learned that passing an array by reference allows us to obtain its size. I just played little bit with code, and tried to pass a

相关标签:
4条回答
  • 2020-12-19 10:13

    For the language difference (keeping only the function declarations below, since that's what's important only)

    void execute( void (&func)() );
    
    void g();
    int main() {
      void (*fp)() = g;
      execute(fp); // doesn't work
      execute(&g); // doesn't work either
      execute(g); // works
    }
    

    It doesn't work, because it wants a function, not a function pointer. For the same reason that array answer rejects a pointer, this rejects a pointer too. You have to pass "g" directly.

    For templates, it matters too

    template<typename T>
    void execute(T &t) { T u = t; u(); }
    
    template<typename T>
    void execute(T t) { T u = t; u(); }
    

    Those two are very different from one another. If you call it with execute(g); like above, then the first will try to declare a function and initialize it with t (reference to g). The generated function would look like this

    void execute(void(&t)()) { void u() = t; u(); }
    

    Now you can initialize references and pointers to functions, but of course not functions itself. In the second definition, T will be deduced to a function pointer type by template argument deduction, and passing a function will convert it to that pointer parameter type implicitly. So everything will go fine.


    I don't know why MSVC treats them differently for inlining - but i also suspect it's because function references appear more seldom.

    0 讨论(0)
  • 2020-12-19 10:23

    I think it is due to the C++ Standard 4.3:

    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.

    0 讨论(0)
  • 2020-12-19 10:27

    The difference between a reference(&) and pointer(*) is that the reference provides the address of the variable or the location, and the pointer points to the location in memory of the address stored in it.

    int *pointer;
    int variable;
    
    pointer = &variable; // assigning the address of variable to pointer 
    
    variable = 53;  // value of variable
    
    cout << *pointer; // This should output the value of the address where is pointing, in this
                      //  case 53, that is the value of variable to where is pointing.
    

    We can conclude that the (&variable) have the address of that memory location and *anyname points to the address stored in its memory...

    0 讨论(0)
  • 2020-12-19 10:33

    It's not as common an idiom, so it might just be that the VS team didn't add a rule to optimise it.

    0 讨论(0)
提交回复
热议问题