reinterpret_cast,std :: aligned_storage和placement

时间:2015-09-05 18:50:40

标签: c++ c++11 language-lawyer reinterpret-cast strict-aliasing

考虑以下对象:

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,因此我最终构造了一个永远不会取消引用的指针。

0 个答案:

没有答案