我能逆转数组到指针衰减的过程吗?

Can I reverse the process of array-to-pointer decay?

本文关键字:过程 衰减 指针 逆转 数组      更新时间:2023-10-16

将指向数组第一个元素的指针强制转换为指向整个数组的指针是否合法?

template<typename T, size_t N>
void whatever(T(&)[N])
{
    std::cout << N << 'n';
}
int main()
{
    int a[10];
    int * p = a;
    whatever(*(int(*)[10])(p));   // <-- legal?
}

这在我的编译器上打印10,但我不确定c++标准是否允许。

不,这是不合法的(因为它是未定义行为)。指向整个数组的指针是&a,而不是p。基本上,你将一个指针转换为另一个指针。标准描述了所有允许的转换,而这个不是其中之一。

我记得我曾经总结过

  • 将指向pod结构体第一个元素的指针转换为指向pod结构体的指针
  • 将指向数组元素的指针转换为指向足够小的数组元素的指针

都是定义良好的。但是,如果第一个结论非常直接(例如,标准中有一个章节用非常简单的文字说明了这一点),第二个步骤需要几个步骤(例如,你需要把标准的几个部分放在一起并得出结论),我现在没有时间重新搜索。如果没有人以这样或那样的方式给出引用,我稍后会尝试回来提供一些。

编辑:我还没有找到我的推理。目前我所拥有的是,在假设reinterpret_cast给出与数组衰减相同的结果的情况下,从"指向数组的指针"到"指向第一个元素的指针"到"指向数组的指针"的往返是有保证的(根据c++ 98中的5.2.10/7),因为数组的对齐要求不能比元素的对齐要求更严格。