考虑以下对象:
std::array<std::aligned_storage_t<sizeof(T), alignof(T)>, size> container;
如果我已经在此数组的第一个元素上调用了new new,我相信完成以下操作是完全可以接受的:
reinterpret_cast<T *>(container.data());
这是因为data()
返回一个指向底层数组的指针,它也可以被视为指向该底层数组的第一个元素的指针。我已经通过新位置分配了该位置的对象,因此在该位置 是T
类型的对象。
请注意reinterpret_cast
此处应该有效,而不是static_cast
链,请参阅static_cast and reinterpret_cast for std::aligned_storage。
但是,如果我实际上没有调用贴片新内容怎么办?构造这个指针对我来说是否合法,只要我不取消引用它?
我的动机是实现一个由静态数组支持的类std::vector
类(所以没有间接或动态分配)。我正在尝试实现data()
成员函数。能够拥有始终有效,零开销的方法来创建表示数据的指针+大小对是很方便的:data()
,size()
。由于size()
将返回0,因此我最终构造了一个永远不会取消引用的指针。