<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
如果引數是右值或右值參考,有條件地將引數轉型為右值參考。 這會將引數的右值特性還原為轉送函式,以支援完美轉送。
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
可讓編譯器在具備所轉送引數原始類型的知識下執行多載解析。 轉送函式的自變數明顯類型可能與其原始類型不同,例如,當右值當做函式的自變數使用且系結至參數名稱時;具有名稱會使它成為左值,而任何值實際上都以右值的形式存在, forward
會還原自變數的右值性。
還原自變數原始值的右值,以執行多載解析,稱為 完美的轉送。 完美轉送讓樣板函式接受任何參考類型的引數,並在正確的多載解析需要時還原它的右值特性。 透過完美轉送,您可以保存右值的移動語意,避免必須為只變更其引數參考類型的函式提供多載。
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
參數的多載,要傳回的專案是由 type 自變數所推斷。 如果 pr
包含或少於類型的T
一個專案,則呼叫 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
的第二個項目。
傳回值
建構的配對物件:pair
T
<、U
>(Val1
、 。 Val2
備註
make_pair
將 Class 類型的 reference_wrapper
物件轉換為參考型別,並將衰變數組和函式轉換成指標。
在傳回的 pair
物件,T
的判斷方式如下:
如果輸入類型
T
是reference_wrapper<X>
,傳回的類型T
是X&
。否則,傳回的類型
T
為decay<T>::type
。 如果decay
不支援 Class ,則傳回的類型T
與輸入類型T
相同。
傳回的類型 U
同樣是根據輸入類型 U
判斷。
的 make_pair
其中一個優點是,要儲存的物件類型是由編譯程式自動決定,而且不需要明確指定。 請勿使用明確的範本自變數,例如 make_pair<int, int>(1, 2)
當您使用 make_pair
時,因為它很詳細,並新增可能導致編譯失敗的複雜右值參考問題。 在這個範例中,正確語法是 make_pair(1, 2)
。
make_pair
協助程式函式也能夠讓您傳遞兩個值給需要成對輸入參數的函式。
範例
如需如何使用協助程式函 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
交換兩種類型或 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<int, int>(1, 2)
當您使用 swap
時,因為它很詳細,並新增可能導致編譯失敗的複雜右值參考問題。
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)
是有效的範圍。