Поделиться через


<utility>Функции

as_const

template <class T> constexpr add_const_t<T>& as_const(T& t) noexcept;
template <class T> void as_const(const T&&) = delete;

Возвращаемое значение

Возвращает T.

declval

template <class T> add_rvalue_reference_t<T> declval() noexcept;  // as unevaluated operand

exchange

(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

forward

Условно приводит свой аргумент к ссылке 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

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);

get

Получает элемент из объекта 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

index_sequence

template<size_t... I>
    using index_sequence = integer_sequence<size_t, I...>;

index_sequence_for

template<class... T>
    using index_sequence_for = make_index_sequence<sizeof...(T)>;

make_index_sequence

template<size_t N>
    using make_index_sequence = make_integer_sequence<size_t, N>;

make_integer_sequence

template<class T, T N>
    using make_integer_sequence = integer_sequence<T, see below >;

make_pair

Функция шаблона, которую можно использовать для построения объектов типа 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.

Возвращаемое значение

Объект пары, созданный: pairT<,U>(Val1, ). Val2

Замечания

make_pairПреобразует объект класса type reference_wrapper в ссылочные типы и преобразует разложенные массивы и функции в указатели.

В возвращенном объекте pairT определяется следующим образом:

  • Если тип ввода 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 "Структура".

move

Безусловно приводит свой аргумент к ссылке 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 по его имени или адресу после перемещения.

move_if_noexcept

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;

swap

Обмен элементами двух типов или 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

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) требуется быть допустимым диапазоном.