Why using the const keyword before and after method or function name?

Solution 1:

const T& get_data() const { return data_; }
^^^^^

means it will return a const reference to T (here data_)

Class c;
T& t = c.get_data()             // Not allowed.
const T& tc = c.get_data()      // OK.


const T& get_data() const { return data_; }
                    ^^^^^

means the method will not modify any member variables of the class (unless the member is mutable).

void Class::get_data() const {
   this->data_ = ...;  // is not allowed here since get_data() is const (unless 'data_' is mutable)
   this->anything = ... // Not allowed unless the thing is 'mutable'
}

Solution 2:

The const (and volatile) qualifier binds to the left. This means that any time you see const, it is being applied to the token to the left of it. There is one exception, however; if there's nothing to the left of the const, it binds to the right, instead. It's important to remember these rules.

In your example, the first const has nothing to the left of it, so it's binding to the right, which is T. This means that the return type is a reference to a const T.

The second const does have something to the left of it; the function data(). This means that the const will bind to the function, making it a const function.

In the end, we have a const function returning a reference to a const T.