<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
移動コンストラクターが使用可能な場合は古い値のコピーを回避し、一時オブジェクトまたは移動された場合は新しい値のコピーを回避し、使用可能な変換代入演算子を使用して任意の型を新しい値として受け入れます。 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
引数が右辺値または右辺値参照である場合に、条件付きで引数を右辺値参照にキャストします。 これによって、完全転送をサポートする転送関数に対する引数の右辺値性が復元されます。
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
キャストする引数。
戻り値
Arg
に渡された値が最初は右辺値または右辺値参照であった場合、Arg
への右辺値参照を返します。それ以外の場合は、型を変更しないで Arg
を返します。
解説
forward
を呼び出すために明示的なテンプレート引数を指定する必要があります。
forward
は引数を転送しません。 代わりに、引数が元から右辺値または右辺値参照であった場合、条件付きで引数を右辺値参照にキャストすることにより、forward
は、転送された引数の元の型の情報を使って、コンパイラでオーバーロードを解決できるようにします。 転送関数の引数の明確な型は元の型とは異なる場合があります。たとえば、rvalue が関数の引数として使用され、パラメーター名にバインドされている場合、名前を付けると、どの値が実際に rvalue として存在する場合でも lvalue になります。forward
は引数の 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
1 番目の pair 要素の型。
T2
2 番目の pair 要素の型。
pr
選択する pair。
解説
各テンプレート関数は、 pair
引数の要素への参照を返します。
インデックスを使用したオーバーロードでは、関数は、 Index
の値が 0 の場合は pr.first
を返し、 Index
の値が 1 の場合は pr.second
を返します。 型 RI
は、返される要素の型です。
Index
パラメーターがないオーバーロードでは、返される要素は型の引数によって推測されます。 pr
に含まれる型 T
の要素の数が 1 より多いか少ない場合、get<T>(Tuple)
を呼び出すと、コンパイラ エラーが生成されます。
例
#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
の 2 番目の要素を初期化する値。
戻り値
作成されたペア オブジェクト: pair
<T
,U
>(Val1
, Val2
)。
解説
make_pair
では、reference_wrapper
クラス型のオブジェクトを参照型に変換し、減衰配列および関数をポインターに変換します。
返された pair
オブジェクトで、T
は次のように決定されます。
入力の型
T
がreference_wrapper<X>
である場合、戻り値の型T
はX&
です。それ以外の場合、戻り値の型
T
はdecay<T>::type
になります。decay
クラスがサポートされない場合、戻り値の型T
は、入力の型T
と同じです。
戻り値の型 U
は、入力の型 U
から同様に決定されます。
make_pair
の利点の 1 つは、格納されるオブジェクトの型がコンパイラによって自動的に決定され、明示的に指定する必要がないことです。 make_pair
を使用する場合は、make_pair<int, int>(1, 2)
などの明示的なテンプレート引数を使用しないでください。詳細になって、複雑な rvalue 参照の問題が追加され、コンパイル エラーの原因となる可能性があるためです。 この例の場合、正しい構文は make_pair(1, 2)
です。
make_pair
ヘルパー関数は、入力パラメーターとしてペアを必要とする関数に 2 個の値を渡すこともできます。
例
make_pair
ヘルパー関数を使用してペアを宣言して初期化する方法の例については、「pair
構造体」を参照してください。
move
無条件に引数を右辺値参照にキャストし、型の移動が有効である場合に型が移動できることを通知します。
template <class Type>
constexpr typename remove_reference<Type>::type&& move(Type&& Arg) noexcept;
パラメーター
Type
Arg
で渡された引数の型と、参照縮小規則から推論される型。
Arg
キャストする引数。 Arg
の型が右辺値参照として指定されているように見えますが、move
では、左辺値参照を右辺値参照にバインドできるため、左辺値参照も受け取ります。
戻り値
型が参照型であるかどうかに関係なく、右辺値参照としての Arg
。
解説
テンプレート引数 Type
は明示的に指定されるのではなく、 Arg
で渡された値の型から推測されることを意図しています。 Type
の型は、参照縮小規則に従ってさらに調整されます。
move
は引数を移動しません。 代わりに、その引数 (左辺値である可能性がある) を無条件に右辺値参照にキャストすることにより、型の移動が有効である場合、コンパイラは Arg
に渡された値をコピーではなく移動できます。 型の移動が有効ではない場合は、代わりにコピーされます。
Arg
で渡された値が左辺値である場合、つまり、名前を持つ場合や、そのアドレスを取得できる場合、移動が発生したときに無効になります。 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
2 つの型または pair
構造体のオブジェクトの要素を交換します。
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
の利点の 1 つは、格納されるオブジェクトの型がコンパイラによって自動的に決定され、明示的に指定する必要がないことです。 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)
は有効な範囲であることが必要です。