我可以反转数组到指针衰减的过程吗?

时间:2011-12-26 12:02:01

标签: c++ arrays pointers casting reference

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

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 ++标准是否允许它。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我记得已经得出结论

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

都很明确。但是,如果第一个结论是非常直接的(即标准中有一节用非常简单的话说的话),那么第二个结论需要几个步骤(即你需要将标准的几个部分放在一起并得出结论)而且我现在没时间重做搜索了。如果没有人以某种方式提出引用,我会稍后再尝试一些。

编辑:我没有找到我的理由。目前我所有的都是假设reinterpret_cast给出与数组衰减相同的结果,从“指向数组的指针”到“指向第一个元素的指针”到“指向数组的指针”的往返是保证(在C ++ 98中为5.2.10 / 7),因为数组的对齐要求不能低于元素的对齐要求。