Namespaces
Variants

std::ranges::construct_at

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

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


 
 
헤더에 정의됨<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 배열 유형의 객체를 생성할 수 없었습니다 경계가 있는 배열을 값 초기화할 수 있습니다

함께 보기

주어진 주소의 객체를 파괴합니다
(알고리즘 함수 객체)
주어진 주소에 객체를 생성합니다
(함수 템플릿)