std :: array是否可以为更大数组的片段添加别名?

kin*_*juf 11 c++ arrays strict-aliasing type-punning c++11

假设我们有一个指针,T* ptr;并且ptr, ptr+1, … ptr+(n-1)所有引用类型为T的有效对象.

是否有可能像STL一样访问它们array?或者执行以下代码:

std::array<T,n>* ay = (std::array<T,n>*) ptr
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为?

Ser*_*eyA 2

是的,这会调用未定义的行为。通常,您不能在彼此之间转换指向不相关类型的指针。

代码与

std::string str;
std::array<double,10>* arr = (std::array<double,10>*)(&str);
Run Code Online (Sandbox Code Playgroud)

说明: 标准不为std::array<T,n>和之间的任何兼容性提供任何保证T*。它根本不存在。它也没有说这std::array是琐碎的类型。如果没有这样的保证,T*和之间的任何转换std::array<T,n>都是未定义的行为,其规模与指向任何不相关类型的指针之间的转换相同。

我也看不出将已构建的动态数组作为std::array.

PS 通常免责声明。就其本身而言,演员总是 100% 好的。正是结果指针的间接触发触发了烟花 - 但为了简单起见,省略了这部分。

  • `std::array` 保证(不是直接,而是通过措辞间接,http://stackoverflow.com/questions/19103244/is-the-size-of-stdarray-define-by-standard)以 N 开头类型 T 的副本。因此,所讨论的两种类型具有共同的前缀。它仍然是 UB,但它与你的示例明显不同。 (4认同)
  • 我只能重复一遍。由于 Standard 不保证指向 `T` 和 `std::array&lt;T&gt;` 的指针之间的兼容性(就像它不提供 T 和 `std::array&lt;double&gt; 之间的兼容性一样),两次尝试都显示 **等于**未定义的行为。会将相同的文字放入我的答案中。 (4认同)