Evaluating a completely parenthesized arithmetic expression
Use Iterators
The int i and int j are unnecessary parameters in int evaluate(const std::string&amp; expr, int i, int j).
The string class is a standard container class. Standard container classes provide the begin() and
end() functions that provide iterators to the first element and the last element of the container.
This StackOverflow.com Question highlights why iterators are good.

This StackOverflow.com question provides a possible example for finding the last character to process. 

Using iterators will be faster than using indexing by integer. In C++11 or later the following loop
will advance the iterator until non-white space characters are found in the string.

for (auto CharInExperession : exper)
{
    if (!isspace(*CharInExperssion)) {
        break;
    }
}


Use Standard C++ functions to check for white space
In the example above isspace() is used, this checks for all white space, not just space so it checks for
tabs, spaces and new lines. See isspace for information on how to use it. 

Reduce the Complexity of the Code
There is no reason to have the else clause for if(i == j) {, the code in the else clause can be out-dented
because of the return in the if-then portion.