std::ranges::swap
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 */ |
||
Intercambia los valores referenciados por t
y u
.
Una llamada a ranges::swap
:
- 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:
- template<class T> void swap(T&, T&) = delete;
- template<class T, std::size_t N> void swap(T(&)[N], T(&)[N]) = delete;
- cualquier declaración de
swap
encontrada por la búsqueda dependiente de argumento.
- Si la función seleccionada por la resolución de sobrecarga no intercambia los valores referenciados por
t
yu
, el programa está mal formado; no se requiere diagnóstico.
- 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
yU
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; - 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
yU
son ambasV&
para algún tipoV
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
yv
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.
- 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
(C++20) |
Especifica que un tipo puede ser intercambiado o que dos tipos pueden ser intercambiados uno con el otro. (concepto) |
Intercambia los valores de dos objetos (plantilla de función) |