<utility>
Функции
template <class T> constexpr add_const_t<T>& as_const(T& t) noexcept;
template <class T> void as_const(const T&&) = delete;
Возвращает T
.
template <class T> add_rvalue_reference_t<T> declval() noexcept; // as unevaluated operand
(C++14)
Назначает новое значение объекту и возвращает его старое значение.
template <class T, class Other = T>
T exchange(T& val, Other&& new_val)
val
Объект, который получит значение new_val
.
new_val
Объект, значение которого копируется или перемещается в val
.
Для сложных типов exchange
избегает копирования старого значения при наличии конструктора перемещения, избегает копирования нового значения, если это временный объект или перемещается, и принимает любой тип в качестве нового значения, используя любой доступный оператор преобразования назначения. Функция обмена отличается от std::swap
того, что левый аргумент не перемещается или не копируется в правый аргумент.
В следующем примере показано, как использовать exchange
. В реальной ситуации exchange
наиболее полезен с большими объектами, копирование которых является дорогостоящим:
#include <utility>
#include <iostream>
using namespace std;
struct C
{
int i;
//...
};
int main()
{
// Use brace initialization
C c1{ 1 };
C c2{ 2 };
C result = exchange(c1, c2);
cout << "The old value of c1 is: " << result.i << endl;
cout << "The new value of c1 after exchange is: " << c1.i << endl;
return 0;
}
The old value of c1 is: 1
The new value of c1 after exchange is: 2
Условно приводит свой аргумент к ссылке rvalue, если аргумент представляет собой rvalue или ссылку rvalue. Это восстанавливает присущие rvalue характеристики аргумента для функции пересылки для обеспечения точной пересылки.
template <class Type> // accepts lvalues
constexpr Type&& forward(typename remove_reference<Type>::type& Arg) noexcept
template <class Type> // accepts everything else
constexpr Type&& forward(typename remove_reference<Type>::type&& Arg) noexcept
Type
Тип значения, передаваемого в Arg
, который может отличаться от типа Arg
. Как правило, определяется аргументом шаблона функции пересылки.
Arg
Аргумент для приведения.
Возвращает ссылку rvalue Arg
, если значение, переданное в Arg
, изначально было rvalue или ссылкой на rvalue; в противном случае возвращает Arg
, не изменяя его тип.
Необходимо указать явный аргумент шаблона для вызова forward
.
forward
не перенаправит его аргумент. Вместо этого путем условного приведения аргумента к ссылке rvalue, как если бы он изначально был rvalue или ссылкой rvalue, forward
позволяет компилятору выполнять разрешение перегрузки с использованием сведений об исходном типе пересылаемого аргумента. Очевидный тип аргумента функции пересылки может отличаться от исходного типа, например, если rvalue используется в качестве аргумента функции и привязан к имени параметра; имя делает его lvalue, причем любое значение на самом деле существует как rvalue, forward
восстанавливает rvalue-ness аргумента.
Восстановление rvalue-ness исходного значения аргумента для разрешения перегрузки называется идеальным переадресациям. Точная пересылка позволяет шаблонной функции принимать аргумент любого ссылочного типа и восстановить его присущие rvalue характеристики, когда это необходимо для правильного разрешения перегрузки. С помощью точной пересылки можно сохранять семантику перемещения для значений rvalue и избегать необходимости предоставления перегрузок функциям, которые отличаются только ссылочным типом их аргументов.
from_chars_result from_chars(const char* first, const char* last, see below& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, float& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, double& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, long double& value, chars_format fmt = chars_format::general);
Получает элемент из объекта pair
по позиции индекса или по типу.
// get reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr tuple_element_t<Index, pair<T1, T2>>&
get(pair<T1, T2>& Pr) noexcept;
// get reference to element T1 in pair Pr
template <class T1, class T2>
constexpr T1& get(pair<T1, T2>& Pr) noexcept;
// get reference to element T2 in pair Pr
template <class T2, class T1>
constexpr T2& get(pair<T1, T2>& Pr) noexcept;
// get const reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr const tuple_element_t<Index, pair<T1, T2>>&
get(const pair<T1, T2>& Pr) noexcept;
// get const reference to element T1 in pair Pr
template <class T1, class T2>
constexpr const T1& get(const pair<T1, T2>& Pr) noexcept;
// get const reference to element T2 in pair Pr
template <class T2, class T1>
constexpr const T2& get(const pair<T1, T2>& Pr) noexcept;
// get rvalue reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr tuple_element_t<Index, pair<T1, T2>>&&
get(pair<T1, T2>&& Pr) noexcept;
// get rvalue reference to element T1 in pair Pr
template <class T1, class T2>
constexpr T1&& get(pair<T1, T2>&& Pr) noexcept;
// get rvalue reference to element T2 in pair Pr
template <class T2, class T1>
constexpr T2&& get(pair<T1, T2>&& Pr) noexcept;
Index
0-й индекс выбранного элемента.
T1
Тип первого элемента пары.
T2
Тип второго элемента пары.
pr
Пара для выбора элемента.
Каждая функция шаблона возвращает ссылку на элемент аргумента pair
.
Для индексированных перегрузок, если значение Index
равно 0, функция возвращает pr.first
, а если значение Index
равно 1, функция возвращает pr.second
. Тип RI
— это тип возвращаемого элемента.
Для перегрузки, у которых нет Index
параметра, возвращаемый элемент выводится аргументом типа. Вызов get<T>(Tuple)
вызовет ошибку компилятора, если pr
содержит более или менее одного элемента типа T
.
#include <utility>
#include <iostream>
using namespace std;
int main()
{
typedef pair<int, double> MyPair;
MyPair c0(9, 3.14);
// get elements by index
cout << " " << get<0>(c0);
cout << " " << get<1>(c0) << endl;
// get elements by type (C++14)
MyPair c1(1, 0.27);
cout << " " << get<int>(c1);
cout << " " << get<double>(c1) << endl;
}
9 3.14
1 0.27
template<size_t... I>
using index_sequence = integer_sequence<size_t, I...>;
template<class... T>
using index_sequence_for = make_index_sequence<sizeof...(T)>;
template<size_t N>
using make_index_sequence = make_integer_sequence<size_t, N>;
template<class T, T N>
using make_integer_sequence = integer_sequence<T, see below >;
Функция шаблона, которую можно использовать для построения объектов типа pair
, где типы компонентов автоматически выбираются на основе типов данных, переданных в качестве параметров.
template <class T, class U>
pair<T, U> make_pair(T& Val1, U& Val2);
template <class T, class U>
pair<T, U> make_pair(T& Val1, U&& Val2);
template <class T, class U>
pair<T, U> make_pair(T&& Val1, U& Val2);
template <class T, class U>
pair<T, U> make_pair(T&& Val1, U&& Val2);
Val1
Значение, которое инициализирует первый элемент pair
.
Val2
Значение, которое инициализирует второй элемент pair
.
Объект пары, созданный: pair
T
<,U
>(Val1
, ). Val2
make_pair
Преобразует объект класса type reference_wrapper
в ссылочные типы и преобразует разложенные массивы и функции в указатели.
В возвращенном объекте pair
T
определяется следующим образом:
Если тип ввода
T
имеет значениеreference_wrapper<X>
, возвращаемый типT
имеет значениеX&
.В противном случае возвращаемый тип
T
имеет значениеdecay<T>::type
. Еслиdecay
класс не поддерживается, возвращаемый типT
совпадает с типомT
входных данных.
Возвращаемый тип U
аналогичным образом определяется по типу ввода U
.
Одним из преимуществ make_pair
является то, что типы объектов, которые хранятся, определяются автоматически компилятором и не должны быть явно указаны. Не используйте явные аргументы шаблона, такие как при использованииmake_pair
, так как make_pair<int, int>(1, 2)
это подробно и добавляет сложные проблемы со ссылкой rvalue, которые могут привести к сбою компиляции. В данном случае правильный синтаксис — make_pair(1, 2)
Вспомогательная функция make_pair
также предоставляет возможность передать два значения в функцию, которой в качестве параметра ввода требуется пара.
Пример использования вспомогательной функции make_pair
для объявления и инициализации пары см. в разделе pair
"Структура".
Безусловно приводит свой аргумент к ссылке rvalue, тем самым указывая, что его можно переместить, если его тип допускает перемещения.
template <class Type>
constexpr typename remove_reference<Type>::type&& move(Type&& Arg) noexcept;
Type
Тип, выведенный из типа аргумента, переданного в Arg
, а также правила сворачивания ссылок.
Arg
Аргумент для приведения. Несмотря на то, что тип Arg
определен как ссылка rvalue, move
также принимает аргументы lvalue, поскольку ссылки lvalue можно привязать к ссылкам rvalue.
Arg
используется в качестве ссылки rvalue вне зависимости от того, является ли его тип ссылочным.
Аргумент Type
шаблона не предназначен для явного указания, но должен быть выведен из типа передаваемого Arg
значения. Тип Type
дополнительно адаптируется в соответствии с правилами сворачивания ссылок.
move
не перемещает его аргумент. Вместо этого, путем безусловного приведения аргумента (который может являться ссылкой lvalue) к ссылке rvalue он обеспечивает компилятору возможность впоследствии переместить, а не скопировать значение, переданное в Arg
, если его тип допускает перемещение. Если его тип не включен, он копируется.
Если значение, переданное в Arg
, является ссылкой lvalue, то есть его имя или адрес можно получить, при перемещении оно становится недействительным. Не ссылайтесь на значение, переданное Arg
по его имени или адресу после перемещения.
template <class T> constexpr conditional_t< !is_nothrow_move_constructible_v<T> && is_copy_constructible_v<T>, const T&, T&&> move_if_noexcept(T& x) noexcept;
Обмен элементами двух типов или pair
объектов Structure .
template <class T>
void swap(T& left, T& right) noexcept(see below );
template <class T, size_t N>
void swap(T (&left)[N], T (&right)[N]) noexcept(is_nothrow_swappable_v<T>);
template <class T, class U>
void swap(pair<T, U>& left, pair<T, U>& right);
left
Объект типа или типа pair
.
right
Объект типа или типа pair
.
Одним из преимуществ swap
является то, что типы объектов, которые хранятся, определяются автоматически компилятором и не должны быть явно указаны. Не используйте явные аргументы шаблона, такие как при использованииswap
, так как swap<int, int>(1, 2)
это подробно и добавляет сложные проблемы со ссылкой rvalue, которые могут привести к сбою компиляции.
to_chars_result to_chars(char* first, char* last, see below value, int base = 10);
to_chars_result to_chars(char* first, char* last, float value);
to_chars_result to_chars(char* first, char* last, double value);
to_chars_result to_chars(char* first, char* last, long double value);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt, int precision);
Преобразует значение в символьную строку, заполнив диапазон [first, last)
, где [first, last)
требуется быть допустимым диапазоном.