Espacios de nombres
Variantes
Acciones

std::ranges::swap

De cppreference.com
< cpp‎ | utility
 
 
Biblioteca de servicios
Servicios generales
Operadores relacionales (en desuso en C++20)
Funciones de comparación de enteros
(C++20)(C++20)(C++20)  
(C++20)
Intercambio y operaciones de tipos
ranges::swap
(C++20)
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Tipos vocabulario comunes
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Definido en el archivo de encabezado <concepts>
inline namespace /* no especificado */ {

    inline constexpr /* no especificado */ swap = /* no especificado */;

}
(desde C++20)
(objeto punto de personalización)
Signatura de la llamada
template< class T, class U >

    requires /* véase más abajo */

constexpr void swap(T&& t, U&& u) noexcept(/* véase más abajo */);

Intercambia los valores referenciados por t y u.

Una llamada a ranges::swap:

  1. es equivalente en expresión a (void)swap(std::forward<T>(t), std::forward<U>(u)), si esa expresión es válida, donde la resolución de sobrecarga se realiza con los siguientes candidatos:
    Si la función seleccionada por la resolución de sobrecarga no intercambia los valores referenciados por t y u, el programa está mal formado; no se requiere diagnóstico.
  2. De lo contrario, es equivalente en expresión a (void)ranges::swap_ranges(t, u) excepto que noexcept(ranges::swap(t), ranges::swap(u)) es igual a noexcept(ranges::swap(*t, *u)), si T y U son referencias a l-valor a tipos array de igual extensión (pero posiblemente de tipos de elementos diferentes) y ranges::swap(*t, *u) es una expresión válida;
  3. De lo contrario, intercambia los valores referenciados como si lo fuera por V v(std::move(t)); t = std::move(u); u = std::move(v);, si T y U son ambas V& para algún tipo V que satisface a std::move_constructible<V> y a std::assignable_from<V&, V>.
    • Si la llamada potencialmente lanza se especifica por las operaciones descritas anteriormente.
    • La llamada es una subexpresión constante si ambas operaciones descritas anteriormente y las operaciones realizadas con u y v intercambiadas son usables en una evaluación constante.
    Si alguno de los conceptos no se modela,, el programa está mal formado; no se requiere diagnóstico.
  4. En todos los otros casos, una llamada a ranges::swap está mal formada, lo que puede resultar en falla en la sustitución cuando ranges::swap(t, u) aparece en el contexto inmediato de la instanciación de una plantilla.

Contenido

[editar] Equivalente en expresión

La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.

[editar] Objetos de punto de personalización

El nombre ranges::swap denota un objeto de punto de personalización, que es un objeto función const de un tipo clase literal semiregular (denotado, a efectos de exposición, como swap_ftor). Todos los ejemplares de swap_ftor son iguales. Por lo tanto, ranges::swap puede copiarse libremente y sus copias pueden usarse indistintamente.

Dado un conjunto de tipos Args..., si std::declval<Args>()... cumple con los requerimientos para los argumentos de ranges::swap mencionado anteriormente, swap_ftor satisfará a std::invocable<const swap_ftor&, Args...>. De lo contrario, ningún operador de llamada a función de swap_ftor participa en la resolución de sobrecarga.

[editar] Ejemplo

#include <array>
#include <concepts>
#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
 
void print(std::string_view const name, 
           std::ranges::common_range auto const& p, 
           std::ranges::common_range auto const& q)
{
    std::cout << name << "1{ ";
    for (auto const& i : p) std::cout << i << ' ';
    std::cout << "}, " << name << "2{ ";
    for (auto const& i : q) std::cout << i << ' ';
    std::cout << "}\n";
}
 
void print(std::string_view const name, int p, int q)
{
    std::cout << name << "1 = " << p << ", " << name << "2 = " << q << '\n';
}
 
int main()
{
    std::vector a1{10,11,12}, a2{13,14};
    std::ranges::swap(a1, a2);
    print("a", a1, a2);
 
    std::array b1{15,16,17}, b2{18,19,20};
    std::ranges::swap(b1, b2);
    print("b", b1, b2);
 
    // std::array c1{1,2,3}; std::array c2{4,5};
    // std::ranges::swap(c1, c2); // ERROR: tipos no coinciden
 
    int d1[]{21,22,23}, d2[]{24,25,26};
    std::ranges::swap(d1, d2);
    print("d", d1, d2);
 
    // int e1[]{1,2,3}, e2[]{4,5};
    // std::ranges::swap(e1, e2); // ERROR: tipos no coinciden
 
    // char f1[]{1,2,3};
    // int  f2[]{4,5,6};
    // std::ranges::swap(f1, f2); // ERROR: tipos no coinciden
 
    int g1{27}, g2{28};
    std::ranges::swap(g1, g2);
    print("g", g1, g2);
}

Salida:

a1{ 13 14 }, a2{ 10 11 12 }
b1{ 18 19 20 }, b2{ 15 16 17 }
d1{ 24 25 26 }, d2{ 21 22 23 }
g1 = 28, g2 = 27

[editar] Véase también

Especifica que un tipo puede ser intercambiado o que dos tipos pueden ser intercambiados uno con el otro.
(concepto) [editar]
Intercambia los valores de dos objetos
(plantilla de función) [editar]