Как make_pair неявно выводит типы?

Хорошо известно, что 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?

2

Решение

Сначала создается 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конструктор, который требует от вас явных типов. Однако я сомневаюсь, что это повысит производительность благодаря оптимизации.

4

Другие решения

Чтобы прокомментировать комментарий Криса, взгляните на это

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 второму

Таким образом, пары любого типа присваиваются друг другу до тех пор, пока присваиваются базовые типы.

3

По вопросам рекламы [email protected]