Q:

Why did I have to change the type of a the value of a map from & to (int*)&

I have the function  getElement that returns a pointer to a value of a map.
 int * getElement(const int &key) const {
        return (int*)&m.find(key)->second;
    }

If I use for instance return &m.find(key)->second it creates a compilation error:

In member function 'int* A::getElement(const int&) const': 12:30:
  error: invalid conversion from 'const int*' to 'int*' [-fpermissive]

Why do I have to change &m.find(key)->second to (int*)&m.find(key)->second in order for the code to compile correctly?

#include <iostream>
#include <string>
#include <map>

class A {
    public:
    void addElement(const int &key, const int &value) {
         m.emplace(key,value);
    }
    int * getElement(const int &key) const {
        return (int*)&m.find(key)->second;
    }
    private:
    std::map<int,int> m;

};

int main()
{
  A a;
  int value = 1;
  int key = 1;
  a.addElement(key,value);
  int * x = a.getElement(1);
  std::cout << *x << std::endl;
  return 0;
}

A:

Why do I have to change &m.find(key)->second to (int*)&m.find(key)->second

You don’t. In fact, doing so potentially creates an error. Instead, remove the const qualifier on your member function if you really want to modify the map values. Or return a const int* instead of an int* from the function.
To clarify, when you specify a member function as being const, then the this pointer inside that function becomes a pointer to a const instance of your class. This, in turn, makes its data members const, transitively.
As a consequence, your std::map<int, int> becomes a std::map<int, int> const inside your getElement function. Furthermore, std::map::find has an overload for const maps that returns a const_iterator — hence the const int*.
In fact, be careful: std::map::iterator isn’t necessarily T*. So you shouldn’t return int* or const int* — you should return std::map<int, int>::iterator (or …::const_iterator).

