命名空间
变体
操作

std::start_lifetime_as, std::start_lifetime_as_array

来自 cppreference.com
< cpp‎ | memory
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库特性测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三元比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受限的未初始化内存算法
分配器
垃圾收集支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



显式生命周期管理
start_lifetime_asstart_lifetime_as_array
(C++23)(C++23)

 
在头文件 <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,

                                  std::size_t n ) noexcept;
(6) (自 C++23 起)
template< class T >

volatile T* start_lifetime_as_array( volatile void* p,

                                     std::size_t n ) noexcept;
(7) (自 C++23 起)
template< class T >

const volatile T* start_lifetime_as_array( const volatile void* p,

                                           std::size_t n ) noexcept;
(8) (自 C++23 起)
1-4) 隐式创建 类型为 T 的完整对象(其地址为 p)以及嵌套在其中的对象。每个创建的对象 objTriviallyCopyable 类型 U 的值由调用 std::bit_cast<U>(E) 确定,但不会实际访问存储,其中 E 是表示 obj 的类型 U 的左值。否则,此类创建对象的取值不确定。
  • [p(char*)p + sizeof(T)) 不表示分配存储的区域,该区域是通过 p 可达的存储区域的子集,或者
  • 该区域对于 T 没有适当的对齐方式。
  • 请注意,不确定的值可能是未确定的。
5-8) 隐式创建 一个元素类型为 T 且长度为 n 的数组。确切地说,如果 n > 0true,则等效于 std::start_lifetime_as<U>(p),其中 U 是类型为“nT 的数组”。否则,该函数没有效果。
  • T 应为 完整类型。否则,程序格式错误。
  • 如果以下情况,则行为未定义:
  • 非空 p 对于 T 数组没有适当的对齐方式,或者
  • n <= std::size_t(-1) / sizeof(T)false,或者
  • n > 0[(char*)p(char*)p + (n * sizeof(T))) 不代表一个可通过 p 访问的存储区域的子集。

内容

[编辑] 参数

p - 包含对象的区域的地址
n - 要创建的数组元素数量

[编辑] 返回值

1-4) 一个指向如上所述完整对象的指针。
5-8) 如果创建了数组,则指向创建的数组的第一个元素的指针;否则,一个与 p 相等的指针。

[编辑] 备注

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 处理未知边界的数组。

特性测试 Std 特性
__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 d = *std::launder(reinterpret_cast<std::complex<float>*>(network_data));
//  std::cout << d << '\n'; // Possible UB, related to CWG1997:
//      the implicitly created complex<float> may hold indeterminate value
 
    auto d = *std::start_lifetime_as<std::complex<float>>(network_data);
    std::cout << d << '\n'; // OK
}

可能的输出

(0.1,0.2)

[编辑] 参考文献

  • C++23 标准 (ISO/IEC 14882:2024)
  • 20.2.6 显式生命周期管理 [obj.lifetime]

[编辑] 参见

(C++20)
将一种类型的对象表示重新解释为另一种类型
(函数模板) [编辑]
将一个 span 转换为其底层字节的视图
(函数模板) [编辑]