Хорошо известно, что make_pair
выводит типы. Вот почему это существует, и это удобно.
Теперь посмотри на это пример:
std::pair <int,int> foo;
std::pair <int,int> bar;
foo = std::make_pair (10,20);
bar = std::make_pair (10.5,'A'); //ok: implicit conversion from pair<double,char>
Теперь я хочу понять, когда именно происходит удержание в строке выше:
bar = std::make_pair (10.5,'A');
Создает ли он пару тогда, когда она присваивается неявным образом? double
в int
а также char
в int
?
Сначала создается std::pair<double, char>
благодаря выводу типа вспомогательной функции std::make_pair
который создает пару точно так же типов, чем вы передали ему, независимо от того, к какому типу вы позже назначите эту пару.
Этот объект затем присваивается std::pair<int,int>
который работает благодаря шаблонный оператор присваивания. Этот оператор в основном позволяет присваивать типы (U1
в T1
, U2
в T2
) который внутренне присваивает (в вашем случае) double
для int
и char
для int
,
В языке нет функции, которая «прогнозирует» тип переменной, в которой будет использоваться выражение, что потребуется для создания pair<int,int>
немедленно без этого шага между ними.
Если хотите избежать этот шаг вы должны быть явными при строительстве пара, что означает, что вы не должны использовать вычитание типа std::make_pair
скорее std::pair
конструктор, который требует от вас явных типов. Однако я сомневаюсь, что это повысит производительность благодаря оптимизации.
Чтобы прокомментировать комментарий Криса, взгляните на это
bar = std::make_pair (10.5,'A');
такой же как
std::pair <double,char> myPair = std::make_pair (10.5,'A');
bar = myPair;
Эта последняя строка теперь использует приведенный ниже оператор присваивания
template< class U1, class U2 >
pair& operator=( const pair<U1,U2>& other );
Назначает other.first первому и other.second второму
Таким образом, пары любого типа присваиваются друг другу до тех пор, пока присваиваются базовые типы.