Namespaces
Variants

std::pair<T1,T2>:: pair

From cppreference.net
Utilities library
pair ( ) ;
(1) (constexpr начиная с C++11)
(условно explicit начиная с C++11)
pair ( const T1 & x, const T2 & y ) ;
(2) (условно explicit начиная с C++11)
(constexpr начиная с C++14)
(3)
template < class U1, class U2 >
pair ( U1 && x, U2 && y ) ;
(начиная с C++11)
(до C++23)
(constexpr начиная с C++14)
(условно explicit)
template < class U1 = T1, class U2 = T2 >
constexpr pair ( U1 && x, U2 && y ) ;
(начиная с C++23)
(условно explicit)
template < class U1, class U2 >
constexpr pair ( pair < U1, U2 > & p ) ;
(4) (начиная с C++23)
(условно explicit)
template < class U1, class U2 >
pair ( const pair < U1, U2 > & p ) ;
(5) (условно explicit начиная с C++11)
(constexpr начиная с C++14)
template < class U1, class U2 >
pair ( pair < U1, U2 > && p ) ;
(6) (constexpr начиная с C++14)
(условно explicit начиная с C++11)
template < class U1, class U2 >
constexpr pair ( const pair < U1, U2 > && p ) ;
(7) (начиная с C++23)
(условно explicit)
template < pair - like P >
constexpr pair ( P && u ) ;
(8) (начиная с C++23)
(условно explicit)
template < class ... Args1 , class ... Args2 >

pair ( std:: piecewise_construct_t ,
std:: tuple < Args1... > first_args,

std:: tuple < Args2... > second_args ) ;
(9) (начиная с C++11)
(constexpr начиная с C++20)
pair ( const pair & p ) = default ;
(10)
pair ( pair && p ) = default ;
(11) (начиная с C++11)

Создает новую пару.

1) Конструктор по умолчанию. Выполняет инициализацию значением обоих элементов пары, first и second .

Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_default_constructible_v < T1 > и std:: is_default_constructible_v < T2 > оба имеют значение true .

Этот конструктор является explicit тогда и только тогда, когда либо T1 , либо T2 не являются неявно конструируемыми по умолчанию.

(since C++11)
2) Инициализирует first значением x и second значением y .

Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_copy_constructible_v < T1 > и std:: is_copy_constructible_v < T2 > оба имеют значение true .

Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < const T1 & , T1 > имеет значение false или std:: is_convertible_v < const T2 & , T2 > имеет значение false .

(начиная с C++11)
3) Инициализирует first с помощью std:: forward < U1 > ( x ) и second с помощью std:: forward < U2 > ( y ) .
Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_constructible_v < T1, U1 > и std:: is_constructible_v < T2, U2 > оба равны true .
Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < U1, T1 > равно false или std:: is_convertible_v < U2, T2 > равно false .

Этот конструктор определяется как удалённый, если инициализация first или second приведёт к привязке ссылки к временному объекту .

(since C++23)
4) Инициализирует first значением p. first и second значением p. second .
Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_constructible_v < T1, U1 & > и std:: is_constructible_v < T2, U2 & > оба равны true .
Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < U1 & , T1 > равно false или std:: is_convertible_v < U2 & , T2 > равно false .
Этот конструктор определяется как удалённый, если инициализация first или second приведёт к привязке ссылки к временному объекту.
5) Инициализирует first значением p. first и second значением p. second .

Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_constructible_v < T1, const U1 & > и std:: is_constructible_v < T2, const U2 & > оба имеют значение true .

Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < const U1 & , T1 > имеет значение false или std:: is_convertible_v < const U2 & , T2 > имеет значение false .

(since C++11)

Этот конструктор определяется как удалённый, если инициализация first или second привела бы к привязке ссылки к временному объекту.

(since C++23)
6) Инициализирует first с помощью std:: forward < U1 > ( p. first ) и second с помощью std:: forward < U2 > ( p. second ) .
Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_constructible_v < T1, U1 > и std:: is_constructible_v < T2, U2 > оба равны true .
Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < U1, T1 > равно false или std:: is_convertible_v < U2, T2 > равно false .

Этот конструктор определяется как удалённый, если инициализация first или second приведёт к привязке ссылки к временному объекту.

(since C++23)
7) Инициализирует first с помощью std:: forward < const U1 > ( p. first ) и second с помощью std:: forward < const U2 > ( p. second ) .
Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда std:: is_constructible_v < T1, U1 > и std:: is_constructible_v < T2, U2 > оба равны true .
Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < const U1, T1 > равно false или std:: is_convertible_v < const U2, T2 > равно false .
Этот конструктор определяется как удалённый, если инициализация first или second приведёт к привязке ссылки к временному объекту.
8) Дано u1 как std :: get < 0 > ( std:: forward ( u ) ) и u2 как std :: get < 1 > ( std:: forward ( u ) ) , обозначим их типы как U1 и U2 соответственно. Инициализирует first с помощью u1 и second с помощью u2 .
Этот конструктор участвует в разрешении перегрузки тогда и только тогда, когда
Этот конструктор является explicit тогда и только тогда, когда std:: is_convertible_v < U1, T1 > равно false или std:: is_convertible_v < U2, T2 > равно false .
Этот конструктор определяется как удалённый, если инициализация first или second приведёт к привязке ссылки к временному объекту.
9) Переправляет элементы first_args в конструктор first и переправляет элементы second_args в конструктор second . Это единственный конструктор не по умолчанию, который может быть использован для создания пары некопируемых неперемещаемых типов. Программа некорректна, если first или second является ссылкой и привязан к временному объекту.
10) Конструктор копирования неявно объявляется (до C++11) является defaulted и constexpr если копирование обоих элементов удовлетворяет требованиям к constexpr-функциям (начиная с C++11) .
11) Конструктор перемещения является стандартным и constexpr , если перемещение обоих элементов удовлетворяет требованиям к constexpr-функциям.

Содержание

Параметры

x - значение для инициализации первого элемента этой пары
y - значение для инициализации второго элемента этой пары
p - пара значений, используемая для инициализации обоих элементов этой пары
u - pair-like объект значений, используемый для инициализации обоих элементов этой пары
first_args - кортеж аргументов конструктора для инициализации первого элемента этой пары
second_args - кортеж аргументов конструктора для инициализации второго элемента этой пары

Исключения

Не генерирует исключения, если только одна из указанных операций (например, конструктор элемента) не генерирует исключение.

Пример

#include <complex>
#include <iostream>
#include <string>
#include <tuple>
#include <utility>
int main()
{
    auto print = [](auto rem, auto const& pair)
    {
        std::cout << rem << "(" << pair.first << ", " << pair.second << ")\n";
    };
    std::pair<int, float> p1;
    print("(1) Value-initialized: ", p1);
    std::pair<int, double> p2{42, 3.1415};
    print("(2) Initialized with two values: ", p2);
    std::pair<char, int> p4{p2};
    print("(4) Implicitly converted: ", p4);
    std::pair<std::complex<double>, std::string> p6
        {std::piecewise_construct, std::forward_as_tuple(0.123, 7.7),
            std::forward_as_tuple(10, 'a')};
    print("(8) Piecewise constructed: ", p6);
}

Возможный вывод:

(1) Value-initialized: (0, 0)
(2) Initialized with two values: (42, 3.1415)
(4) Implicitly converted: (*, 3)
(8) Piecewise constructed: ((0.123,7.7), aaaaaaaaaa)

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 265 C++98 конструктор по умолчанию копирующе инициализировал first
и second с помощью T1 ( ) и T2 ( ) соответственно
(таким образом требовал, чтобы T1 и T2 были CopyConstructible )
first и second
инициализируются по значению
LWG 2510 C++11 конструктор по умолчанию был неявным сделан условно-явным
N4387 C++11 некоторые конструкторы были только неявными, что препятствовало некоторым использованиям конструкторы сделаны условно-явными

Смотрите также

создаёт объект pair типа, определяемого типами аргументов
(шаблон функции)
конструирует новый tuple
(публичная функция-член std::tuple<Types...> )