Search code examples
c++stliteratorstdvectorrvalue

Why I can take address of *v.begin() where v is a std::vector


#include <vector>
#include <cstdio>
using namespace std;
int f()
{
    int* a = new int(3);
    return *a;
}
int main()
{
    //printf("%p\n", &f()); 
    vector<int> v{3};
    printf("%p\n", &(*(v.begin())));
}

I cannot take address of the f(), If I comment "printf("%p\n", &f()); " out I will get error: lvalue required as unary ‘&’ operand. but how is it possible to take address of *(v.begin())? Isn't * operator the same as a function?


Solution

  • The function f returns a temporary object of the type int

    int f()
    {
        int* a = new int(3);
        return *a;
    }
    

    You may not apply the address of operator for a temporary object.

    You could return a reference to the created dynamically object like for example

    int & f()
    {
        int* a = new int(3);
        return *a;
    }
    

    And in this case this call of printf written like

    printf("%p\n", ( void * )&f());
    

    will be correct.

    As for this expression &(*(v.begin())) then the dereferencing operator does return a reference to the pointed object by the iterator.