std:: start_lifetime_as, std:: start_lifetime_as_array
|
헤더에 정의됨
<memory>
|
||
std::start_lifetime_as
|
||
|
template
<
class
T
>
T * start_lifetime_as ( void * p ) noexcept ; |
(1) | (C++23부터) |
|
template
<
class
T
>
const T * start_lifetime_as ( const void * p ) noexcept ; |
(2) | (C++23부터) |
|
template
<
class
T
>
volatile T * start_lifetime_as ( volatile void * p ) noexcept ; |
(3) | (C++23부터) |
|
template
<
class
T
>
const volatile T * start_lifetime_as ( const volatile void * p ) noexcept ; |
(4) | (C++23부터) |
std::start_lifetime_as_array
|
||
|
template
<
class
T
>
T * start_lifetime_as_array ( void * p, std:: size_t n ) noexcept ; |
(5) | (C++23부터) |
|
template
<
class
T
>
const
T
*
start_lifetime_as_array
(
const
void
*
p,
|
(6) | (C++23부터) |
|
template
<
class
T
>
volatile
T
*
start_lifetime_as_array
(
volatile
void
*
p,
|
(7) | (C++23부터) |
|
template
<
class
T
>
const
volatile
T
*
start_lifetime_as_array
(
const
volatile
void
*
p,
|
(8) | (C++23부터) |
T
타입의 완전한 객체(주소가
p
인)와 그 내부에 중첩된 객체들을 생성합니다. 생성된 각 객체
obj
의 값은
TriviallyCopyable
타입
U
에 대해
std::
bit_cast
<
U
>
(
E
)
호출과 동일한 방식으로 결정되지만, 저장소가 실제로 접근되지는 않습니다. 여기서
E
는
obj
를 나타내는 타입
U
의 lvalue입니다. 그렇지 않은 경우, 생성된 객체들의 값은 지정되지 않습니다.
-
T는 ImplicitLifetimeType 이어야 하며 완전한 타입 이어야 합니다. 그렇지 않으면 프로그램은 형식에 맞지 않습니다. - 다음의 경우 동작은 정의되지 않습니다:
-
-
[p,( char * ) p + sizeof ( T ))가 p 를 통해 접근 가능한 저장소 영역의 부분집합이 아닌 할당된 저장소 영역을 나타내지 않는 경우, 또는 -
해당 영역이
T에 대해 적절하게 정렬되지 않은 경우.
-
- 지정되지 않은 값은 불확정적일 수 있습니다.
T
이고 길이가
n
인 배열을. 정확히 말하면,
n
>
0
이
true
인 경우, 이는
std
::
start_lifetime_as
<
U
>
(
p
)
와 동등합니다. 여기서
U
는 "
n
T
개의 배열" 타입입니다. 그렇지 않으면, 이 함수는 아무 효과도 가지지 않습니다.
-
T는 완전한 타입 이어야 합니다. 그렇지 않으면, 프로그램은 ill-formed입니다. - 다음의 경우 동작은 정의되지 않습니다:
-
-
널이 아닌
p
가
T배열에 적절히 정렬되지 않은 경우, 또는 - n <= std:: size_t ( - 1 ) / sizeof ( T ) 가 false 인 경우, 또는
-
n
>
0
이고
[( char * ) p,( char * ) p + ( n * sizeof ( T ) ))가 p 를 통해 접근 가능한 저장 영역의 부분집합인 할당된 저장 영역을 나타내지 않는 경우.
-
널이 아닌
p
가
목차 |
매개변수
| p | - | 객체로 구성된 영역의 주소 |
| n | - | 생성될 배열 요소의 개수 |
반환값
참고 사항
new
(
void_ptr
)
unsigned
char
[
size
]
또는
new
(
void_ptr
)
std::
byte
[
size
]
는
std::start_lifetime_as
의 비타입 버전으로 동작하지만, 객체 표현을 유지하지는 않습니다.
std :: start_lifetime_as 는 배열이 아닌 타입과 경계가 알려진 배열을 처리하는 반면, std :: start_lifetime_as_array 는 경계가 알려지지 않은 배열을 처리합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_start_lifetime_as
|
202207L
|
(C++23) | 명시적 수명 관리 |
예제
#include <complex> #include <iostream> #include <memory> int main() { alignas(std::complex<float>) unsigned char network_data[sizeof(std::complex<float>)] { 0xcd, 0xcc, 0xcc, 0x3d, 0xcd, 0xcc, 0x4c, 0x3e }; // auto d = *reinterpret_cast<std::complex<float>*>(network_data); // std::cout << d << '\n'; // UB: network_data does not point to a complex<float> // auto d1 = *std::launder(reinterpret_cast<std::complex<float>*>(network_data)); // std::cout << d1 << '\n'; // UB: implicitly created objects have dynamic storage // duration and have indeterminate value initially, // even when an array which provides storage for // them has determinate bytes. // See also CWG2721. auto d2 = *std::start_lifetime_as<std::complex<float>>(network_data); std::cout << d2 << '\n'; // OK }
가능한 출력:
(0.1,0.2)
참고문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 20.2.6 명시적 수명 관리 [obj.lifetime]
참고 항목
|
(C++20)
|
한 타입의 객체 표현을 다른 타입의 객체 표현으로 재해석함
(함수 템플릿) |
|
(C++20)
|
span
을 해당 객체의 기본 바이트 뷰로 변환함
(함수 템플릿) |