分享方式:


<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 的第二個項目。

傳回值

建構的配對物件:pairT<、U>(Val1、 。 Val2

備註

make_pair將 Class 類型的 reference_wrapper 物件轉換為參考型別,並將衰變數組和函式轉換成指標。

在傳回的 pair 物件,T 的判斷方式如下:

  • 如果輸入類型 Treference_wrapper<X>,傳回的類型 TX&

  • 否則,傳回的類型 Tdecay<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) 是有效的範圍。