在c ++中是否已经很好地定义了一个指向数组类型的一个过去的指针?
请考虑以下代码:
#include <cassert>
#include <iterator>
int main()
{
// An array of ints
int my_array[] = { 1, 2, 3 };
// Pointer to the array
using array_ptr_t = int(*)[3];
array_ptr_t my_array_ptr = &my_array;
// Pointer one-past-the-end of the array
array_ptr_t my_past_end = my_array_ptr + 1;
// Is this valid?
auto is_this_valid = *my_past_end;
// Seems to yield one-past-the-end of my_array
assert(is_this_valid == std::end(my_array));
}
Run Code Online (Sandbox Code Playgroud)
常识是,取消引用一个过去的指针是未定义的行为.但是,对于指向数组类型的指针,这是否适用?
这似乎是合理的,这应该是有效的,因为*my_past_end完全可以利用指针算法来解决,并产生一个指向数组中的第一个元素会在那里,这恰好也是一个有效的,过去最末端int*的原始数组my_array.
但是,查看它的另一种方法*my_past_end是生成对不存在的数组的引用,该数组隐式转换为 …