we can directly input values to a pair, and modify them as we like.
  For example:
std::pair<int,int> newp;
std::cin>>newp.first>>newp.second;
newp.first = -1;
Some problems I can think of:
- You don't always have a stream object ready. - std::cinis a very special case, and- std::make_pairis a very generic function.
 
- Who says that both types in the pair support - operator>>?
 
- Const correctness. You may want to have a - constpair.
 
Let's put these three things together to create a non-compiling example:
#include <utility>
#include <iostream>
struct Foo
{
    int i;
};
struct Bar
{
    double d;
};
void printPair(std::pair<Foo, Bar> const& pair)
{
    std::cout << pair.first.i << " " << pair.second.d << "\n";
}
void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
    // error 1: no std::cin, need to use foo and bar
    // error 2: no operator>> for Foo or Bar
    // error 3: cannot change pair values after initialisation
    std::pair<Foo, Bar> const newp;
    std::cin >> newp.first >> newp.second;
    printPair(newp);
    printPair(newp);
}
int main()
{
    Foo foo;
    foo.i = 1;
    Bar bar;
    bar.d = 1.5;
    createAndPrintPairTwice(foo, bar);
}
std::make_pair solves all three problems and makes the code much nicer to read. Note that you don't have to repeat the pair's template arguments:
void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
    std::pair<Foo, Bar> const pair = std::make_pair(foo, bar);
    printPair(pair);
    printPair(pair);
}
What's true is that C++11 has rendered std::make_pair much less useful than before, because you can now also write:
void createAndPrintPairTwice(Foo const& foo, Bar const& bar)
{
    auto const pair = std::pair<Foo, Bar> { foo, bar };
    printPair(pair);
    printPair(pair);
}