Namespaces
Variants

std::ranges::destroy_at

출처: ko.cppreference.net
 
 
알고리즘 라이브러리
제약된 알고리즘 및 레인지 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에서)
집합 연산 (정렬된 범위에서)
병합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
 
헤더에 정의됨 <memory>
호출 서명
template< std::destructible T >
constexpr void destroy_at( T* p ) noexcept;
(C++20부터)

만약 T이(가) 배열 타입이 아니면, p가 가리키는 객체의 소멸자를 p->~T()처럼 호출합니다. 그렇지 않으면, *p의 요소들을 순서대로 재귀적으로 소멸시키며, 호출하는 것처럼 std::destroy(std::begin(*p), std::end(*p)).

이 페이지에 설명된 함수형 개체는 알고리즘 함수 객체입니다 (비공식적으로 니블로이드라고도 함). 즉:

매개변수

p - 파괴될 객체에 대한 포인터

가능한 구현

struct destroy_at_fn
{
    template<std::destructible T>
    constexpr void operator()(T* p) const noexcept
    {
        if constexpr (std::is_array_v<T>)
            for (auto& elem : *p)
                operator()(std::addressof(elem));
        else
            p->~T();
    }
};
inline constexpr destroy_at_fn destroy_at{};

참고 사항

destroy_at 는 파괴할 객체의 타입을 추론하여 소멸자 호출 시 명시적으로 작성하는 것을 피합니다.

destroy_at 이 일부 상수 표현식 e 의 평가 중에 호출될 때, 인수 p 는 수명이 e 의 평가 내에서 시작된 객체를 가리켜야 합니다.

예제

연속된 요소 시퀀스를 파괴하기 위해 ranges::destroy_at을(를) 사용하는 방법을 보여줍니다.

#include <iostream>
#include <memory>
#include <new>

struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " destructed\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 4];
    
    for (int i = 0; i < 4; ++i)
        new (buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    for (int i = 0; i < 4; ++i)
        std::ranges::destroy_at(ptr + i);
}

출력:

0 destructed
1 destructed
2 destructed
3 destructed

같이 보기

객체의 범위를 파괴합니다
(알고리즘 함수 객체)
범위에서 일정 개수의 객체를 파괴합니다
(알고리즘 함수 객체)
주어진 주소에 객체를 생성합니다
(알고리즘 함수 객체)
주어진 주소에 있는 객체를 파괴합니다
(함수 템플릿)