다음을 통해 공유


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

Return Value

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
캐스팅할 인수입니다.

Return Value

Arg에 전달된 값이 원래 rvalue였거나 rvalue에 대한 참조였던 경우 Arg에 대한 rvalue를 반환합니다. 그렇지 않으면 해당 형식을 수정하지 않고 Arg를 반환합니다.

설명

forward를 호출하려면 명시적 템플릿 인수를 지정해야 합니다.

forward 는 인수를 전달하지 않습니다. 대신 원래 rvalue 또는 rvalue 참조였던 경우 해당 인수를 rvalue 참조에 조건적으로 캐스팅하면 forward를 사용하여 컴파일러에서 전달된 인수의 원래 형식을 알고 오버로드 해결을 수행할 수 있습니다. 전달 함수에 대한 인수의 명백한 형식은 원래 형식과 다를 수 있습니다. 예를 들어 rvalue가 함수에 대한 인수로 사용되고 매개 변수 이름에 바인딩되는 경우 이름이 있으면 실제로 rvalue로 존재하는 값이 무엇이든 간에 lvalue 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
첫 번째 pair 요소의 형식입니다.

T2
두 번째 pair 요소의 형식입니다.

pr
선택할 쌍입니다.

설명

각각의 템플릿 함수는 pair 인수의 요소에 대한 참조를 반환합니다.

인덱싱된 오버로드에 대해 Index 의 값이 0이면 함수는 pr.first 를 반환하고, Index 의 값이 1이면 함수는 pr.second를 반환합니다. RI 형식은 반환된 요소의 형식입니다.

매개 변수가 없는 Index 오버로드의 경우 반환할 요소는 형식 인수로 추론됩니다. 호출 get<T>(Tuple) 하면 형식T의 요소가 두 개 이하인 경우 pr 컴파일러 오류가 발생합니다.

예시

#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의 두 번째 요소를 초기화하는 값

Return Value

생성된 pair>Val2<TUVal1pair 개체입니다.

설명

make_pair는 클래스 형식 reference_wrapper 의 개체를 참조 형식으로 변환하고 부패하는 배열과 함수를 포인터로 변환합니다.

반환된 pair 개체에서 T은 다음과 같이 결정됩니다.

  • 입력 형식 Treference_wrapper<X>인 경우 반환된 형식 TX&입니다.

  • 그렇지 않은 경우, 반환된 형식 Tdecay<T>::type입니다. 클래스가 지원되지 않는 경우 decay 반환된 형식 T 은 입력 형식T과 동일합니다.

반환된 형식 U는 마찬가지로 입력 형식 U에서 결정됩니다.

한 가지 장점 make_pair 은 저장되는 개체의 형식이 컴파일러에 의해 자동으로 결정되며 명시적으로 지정할 필요가 없다는 것입니다. 자세한 정보 표시이고 컴파일 실패를 일으킬 수 있는 복잡한 rvalue 참조 문제를 추가하므로 사용할 make_pair 때와 같은 make_pair<int, int>(1, 2) 명시적 템플릿 인수를 사용하지 마세요. 이 예제에서 올바른 구문은 make_pair(1, 2)입니다.

make_pair 도우미 함수도 입력 매개 변수로 한 쌍이 필요한 함수에 두 값을 전달할 수 있습니다.

예시

도우미 함수 make_pair 를 사용하여 쌍을 선언하고 초기화하는 방법에 대한 예제는 Structure를 참조하세요pair.

move

무조건 인수를 rvalue 참조로 캐스트합니다. 따라서 형식이 이동 가능할 경우 이동 가능하다는 신호를 줍니다.

template <class Type>
    constexpr typename remove_reference<Type>::type&& move(Type&& Arg) noexcept;

매개 변수

Type
참조 축소 규칙과 함께 Arg에 전달된 인수의 형식에서 추론된 형식입니다.

Arg
캐스팅할 인수입니다. Arg의 형식이 rvalue 참조로 지정되는 것처럼 보여도 lvalue 참조가 rvalue 참조에 바인딩될 수 있기 때문에 move도 lvalue 인수를 수용합니다.

Return Value

형식과 상관없이, rvalue 참조로서의 Arg는 참조 형식입니다.

설명

템플릿 인수 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 은 저장되는 개체의 형식이 컴파일러에 의해 자동으로 결정되며 명시적으로 지정할 필요가 없다는 것입니다. 자세한 정보 표시이고 컴파일 실패를 일으킬 수 있는 복잡한 rvalue 참조 문제를 추가하므로 사용할 swap 때와 같은 swap<int, int>(1, 2) 명시적 템플릿 인수를 사용하지 마세요.

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) 채워 값을 문자열로 변환합니다.