Namespaces
Variants

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

From cppreference.net
Utilities library
pair ( ) ;
(1) (C++11以降 constexpr)
(C++11以降 条件付き explicit)
pair ( const T1 & x, const T2 & y ) ;
(2) (C++11以降 条件付き explicit)
(C++14以降 constexpr)
(3)
template < class U1, class U2 >
pair ( U1 && x, U2 && y ) ;
(C++11以降)
(C++23まで)
(C++14以降constexpr)
(条件付き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) (C++11以降 条件付きexplicit)
(C++14以降 constexpr)
template < class U1, class U2 >
pair ( pair < U1, U2 > && p ) ;
(6) (C++14以降 constexpr)
(C++11以降 条件付きexplicit)
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以降)
(C++20以降 constexpr)
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 である場合にのみ、オーバーロード解決に参加する。

このコンストラクタは、 T1 または T2 のいずれかが暗黙的にデフォルト構築可能でない場合にのみ explicit となる。

(C++11以降)
2) first x で、 second y で初期化する。

このコンストラクタは、 std:: is_copy_constructible_v < T1 > std:: is_copy_constructible_v < T2 > が両方とも true である場合に限り、オーバーロード解決に参加する。

このコンストラクタは、 std:: is_convertible_v < const T1 & , T1 > false であるか、または std:: is_convertible_v < const T2 & , T2 > false である場合に限り、 explicit となる。

(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 の初期化が 一時オブジェクトへの参照をバインドする 場合に削除定義されます。

(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 の場合にのみオーバーロード解決に参加する。

このコンストラクタは、 std:: is_convertible_v < const U1 & , T1 > false であるか、または std:: is_convertible_v < const U2 & , T2 > false である場合にのみ explicit となる。

(C++11以降)

first または second の初期化が一時オブジェクトへの参照をバインドする場合、このコンストラクタは削除されたものとして定義される。

(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 の初期化が一時オブジェクトへの参照をバインドする場合、削除定義されます。

(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まで) デフォルト化され、両方の要素のコピーがconstexpr関数の要件を満たす場合は constexpr となる (C++11以降)
11) ムーブコンストラクタはデフォルト化され、両方の要素のムーブがconstexpr関数の要件を満たす場合、 constexpr となります。

目次

パラメータ

x - このペアの最初の要素を初期化する値
y - このペアの2番目の要素を初期化する値
p - このペアの両方の要素を初期化するために使用される値のペア
u - pair-like このペアの両方の要素を初期化するために使用される値のペアライクオブジェクト
first_args - このペアの最初の要素を初期化するためのコンストラクタ引数のタプル
second_args - このペアの2番目の要素を初期化するためのコンストラクタ引数のタプル

例外

指定された操作(例:要素のコンストラクタ)が例外をスローしない限り、例外をスローしません。

#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...> の公開メンバ関数)