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)
调用未定义的行为?
是的,这会调用未定义的行为。通常,您不能在彼此之间转换指向不相关类型的指针。
代码与
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% 好的。正是结果指针的间接触发触发了烟花 - 但为了简单起见,省略了这部分。