std::pair::pair
De cppreference.com
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
| (1) | ||
pair(); |
(hasta C++11) | |
constexpr pair(); |
(desde C++11) (conditionally explicit) |
|
| (2) | ||
pair( const T1& x, const T2& y ); |
(hasta C++11) | |
pair( const T1& x, const T2& y ); |
(desde C++11) (hasta C++14) (conditionally explicit) |
|
constexpr pair( const T1& x, const T2& y ); |
(desde C++14) (conditionally explicit) |
|
| (3) | ||
template< class U1, class U2 > pair( U1&& x, U2&& y ); |
(desde C++11) (hasta C++14) (conditionally explicit) |
|
template< class U1, class U2 > constexpr pair( U1&& x, U2&& y ); |
(desde C++14) (hasta C++23) (conditionally explicit) |
|
template< class U1 = T1, class U2 = T2 > constexpr pair( U1&& x, U2&& y ); |
(desde C++23) (conditionally explicit) |
|
| (4) | ||
template< class U1, class U2 > pair( const pair<U1, U2>& p ); |
(hasta C++11) | |
template< class U1, class U2 > pair( const pair<U1, U2>& p ); |
(desde C++11) (conditionally explicit) |
|
| (5) | ||
template< class U1, class U2 > pair( pair<U1, U2>&& p ); |
(desde C++11) (hasta C++14) (conditionally explicit) |
|
template< class U1, class U2 > constexpr pair( pair<U1, U2>&& p ); |
(desde C++14) (conditionally explicit) |
|
| (6) | ||
template< class... Args1, class... Args2 > pair( std::piecewise_construct_t, std::tuple<Args1...> first_args, std::tuple<Args2...> second_args ); |
(desde C++11) (hasta C++20) |
|
template< class... Args1, class... Args2 > constexpr pair( std::piecewise_construct_t, std::tuple<Args1...> first_args, std::tuple<Args2...> second_args ); |
(desde C++20) | |
pair( const pair& p ) = default; |
(7) | |
pair( pair&& p ) = default; |
(8) | (desde C++11) |
Construye un nuevo par.
1) Constructor por defecto. Inicializa por valor ambos elementos del par,
first y second.
|
(desde C++11) |
2) Inicializa
first con x y second con y.
|
(desde C++11) |
3) Inicializa
first con std::forward<U1>(x) y second con std::forward<U2>(y).
- Este constructor participa en la resolución de sobrecargas si y solo si
std::is_constructible_v<first_type, U1&&>ystd::is_constructible_v<second_type, U2&&>sontrue. - Este constructor es
explicitsi y solo sistd::is_convertible_v<U1&&, first_type>esfalseostd::is_convertible_v<U2&&, second_type>esfalse.
4) Inicializa
first con p.first y second con p.second.
|
(desde C++11) |
5) Inicializa
first con std::forward<U1>(p.first) y second con std::forward<U2>(p.second).
- Este constructor participa en la resolución de sobrecargas si y solo si
std::is_constructible_v<first_type, U1&&>ystd::is_constructible_v<second_type, U2&&>sontrue. - Este constructor es
explicitsi y solo sistd::is_convertible_v<U1&&, first_type>esfalseostd::is_convertible_v<U2&&, second_type>esfalse.
6) Reenvía los elementos de
first_args al constructor de first y reenvía los elementos de second_args al constructor de second. Este es el único constructor que no es por defecto que puede usarse para crear un par de tipos no copiables, no movibles.7) El constructor de copia está declarado implícitamente (hasta C++11)se marca
=default, y es constexpr si la copia de ambos elementos satisface los requerimientos en funciones constexpr (desde C++11).8) El constructor de movimiento se marca
=default, y es constexpr si mover ambos elementos satisface los requerimientos en funciones constexpr}}.Parámetros
| x | - | El valor para cual inicializar el primer elemento de este par. |
| y | - | El valor para cual inicializar el segundo elemento de este par. |
| p | - | Un par de valores utilizado para inicializar ambos elementos de este par. |
| first_args | - | Una tupla de los argumentos del constructor con los cuales inicializar el primer elemento de este par. |
| second_args | - | Una tupla de los argumentos del constructor con los cuales inicializar el segundo elemento de este par |
Excepciones
No lanza excepciones a menos que una de las operaciones especificadas (por ejemplo, el constructor de un elemento) lance.
Ejemplo
Ejecuta este código
#include <utility>
#include <string>
#include <complex>
#include <tuple>
#include <iostream>
int main()
{
auto imprimir = [](auto comentario, auto const& pair) {
std::cout << comentario << "(" << pair.first << ", " << pair.second << ")\n";
};
std::pair<int, float> p1;
imprimir("(1) Inicializado por valor: ", p1);
std::pair<int, double> p2{42, 3.1415};
imprimir("(2) Inicializado con dos valores: ", p2);
std::pair<char, int> p4{p2};
imprimir("(4) Convertido implícitamente: ", 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')};
imprimir("(6) Construido pieza por pieza: ", p6);
}
Posible salida:
(1) Inicializado por valor: (0, 0)
(2) Inicializado con dos valores: (42, 3.1415)
(4) Convertido implícitamente: (*, 3)
(6) Construido pieza por pieza: ((0.123,7.7), aaaaaaaaaa)
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| N4387 | C++11 | Algunos constructores eran solo implícitos, impidiendo algunos usos. | Los constructores se hicieron condicionalmente explicit.
|
| LWG 2510 | C++11 | El constructor por defecto era implícito. | Se hizo condicionalmente explicit.
|
Véase también
Crea un objeto de tipo pair, definido por los tipos de los argumentos. (plantilla de función) |