#include <iostream>
#include <string>
#include <utility>

template<class T>
struct C {
  void insert(const T&) { std::cout << "const T&" << std::endl; }
  //void insert(T&&) { std::cout << "T&&" << std::endl; }
  template<class P>
  void insert(P&&) { std::cout << "P&&" << std::endl; }
};

int main()
{
    C<std::pair<std::string, int>> v;

    v.insert(std::make_pair("1st", 1));

    v.insert(std::pair<std::string, int>("2nd", 2));

    std::pair<std::string, int> p1{"3rd", 3};
    v.insert(p1);

    const std::pair<std::string, int> p2{"4th", 4};
    v.insert(p2);

    v.insert({"5th", 5});
}
