std::ranges::destroy_at
출처: ko.cppreference.net
| 헤더에 정의됨 <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)).
이 페이지에 설명된 함수형 개체는 알고리즘 함수 객체입니다 (비공식적으로 니블로이드라고도 함). 즉:
- 이들 중 어떤 것을 호출할 때도 명시적 템플릿 인자 목록을 지정할 수 없습니다.
- 이들은 인자 종속 조회(argument-dependent lookup)에 표시되지 않습니다.
- 이들 중 어떤 것이 함수 호출 연산자 왼쪽의 이름으로 일반 비한정 조회(normal unqualified lookup)에 의해 발견되면, 인자 종속 조회(argument-dependent lookup)가 억제됩니다.
매개변수
| 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
같이 보기
(C++20) |
객체의 범위를 파괴합니다 (알고리즘 함수 객체) |
(C++20) |
범위에서 일정 개수의 객체를 파괴합니다 (알고리즘 함수 객체) |
(C++20) |
주어진 주소에 객체를 생성합니다 (알고리즘 함수 객체) |
(C++17) |
주어진 주소에 있는 객체를 파괴합니다 (함수 템플릿) |