std::ranges::construct_at
| 헤더에 정의됨 <memory>
|
||
| 호출 시그니처 |
||
template< class T, class... Args >
constexpr T* construct_at( T* location, Args&&... args );
|
(C++20부터) | |
생성한다 T 객체를, 인수 args 로 초기화하여 주소 location에.
다음과 동등하다:
if constexpr (std::is_array_v<T>)
return ::new (voidify (*location)) T[1]();
else
return ::new (voidify (*location)) T(std::forward<Args>(args)...);
, 단, construct_at 는 상수식(C++26까지) 평가에 사용될 수 있다.
어떤 상수식 construct_at 평가 중에 expr 가 호출될 때, location 은 std::allocator<T>::allocate 로 얻은 저장소 또는 expr 평가 내에서 수명이 시작된 객체를 가리켜야 한다.
이 오버로드는 다음 모든 조건이 충족될 때만 오버로드 해결에 참여한다:
std::is_unbounded_array_v<T>은false이다.::new(std::declval<void*>()) T(std::declval<Args>()...)이 비평가 피연산자로 처리될 때 올바른 형식이다.
만약 std::is_array_v<T> 이 true 이고 sizeof...(Args) 가 0이 아니면, 프로그램은 ill-formed이다.
이 페이지에 설명된 함수형 엔티티는 알고리즘 함수 객체 (비공식적으로 niebloids로 알려짐) 로, 즉:
- 명시적 템플릿 인자 목록은 이들 중 어느 것을 호출할 때도 지정할 수 없다.
- 이들 중 어느 것도 인자 종속 검색에 보이지 않는다.
- 이들 중 어느 것이 일반 비한정 검색에 의해 함수 호출 연산자의 왼쪽 이름으로 발견될 때, 인자 종속 검색이 억제된다.
매개변수
| location | - |
T
객체가 생성될 초기화되지 않은 저장 공간을 가리키는 포인터
|
| args... | - | 초기화에 사용되는 인수들 |
반환값
location
참고 사항
std::ranges::construct_at
는 인수 종속 lookup에 보이지 않는다는 점을 제외하면
std::construct_at
과 완전히 동일하게 동작합니다.
예제
#include <iostream> #include <memory> struct S { int x; float y; double z; S(int x, float y, double z) : x{x}, y{y}, z{z} { std::cout << "S::S();\n"; } ~S() { std::cout << "S::~S();\n"; } void print() const { std::cout << "S { x=" << x << "; y=" << y << "; z=" << z << "; };\n"; } }; int main() { alignas(S) unsigned char buf[sizeof(S)]; S* ptr = std::ranges::construct_at(reinterpret_cast<S*>(buf), 42, 2.71828f, 3.1415); ptr->print(); std::ranges::destroy_at(ptr); }
출력:
S::S();
S { x=42; y=2.71828; z=3.1415; };
S::~S();
결함 보고서
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3436 | C++20 | construct_at 배열 유형의 객체를 생성할 수 없었습니다
|
경계가 있는 배열을 값 초기화할 수 있습니다 |
함께 보기
(C++20) |
주어진 주소의 객체를 파괴합니다 (알고리즘 함수 객체) |
(C++20) |
주어진 주소에 객체를 생성합니다 (함수 템플릿) |