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

C++ 我可以反转数组到指针的衰减过程吗?,c++,arrays,pointers,casting,reference,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? } 模板 无效(T(&)

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

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?
}
模板
无效(T(&)[N])
{

std::cout不,这是不合法的(因为它是未定义的行为)。指向整个数组的指针是
&A
而不是
p
。基本上,您是在将一个指针投射到另一个指针。标准描述了所有允许的转换,而这一个不在其中。

我记得得出了这样的结论

  • 将指向POD结构的第一个元素的指针转换为指向POD结构的指针
  • 将指向数组中一个元素的指针转换为指向大小足够小的数组的指针
两者都有很好的定义。但是如果第一个结论非常直接(即标准中有一个章节用非常简单的话这么说),那么第二个就采取了几个步骤(即你需要把标准的几个部分放在一起并得出结论)我现在没时间再做搜索了。如果没有人以这样或那样的方式给出引用,我会试着稍后带一些回来


编辑:我还没有找到我的理由。目前我所知道的是,在假设
重新解释\u cast
给出与数组衰减相同的结果的情况下,从“指向数组的指针”到“指向第一个元素的指针”到“指向数组的指针”的往返是有保证的(根据C++98中的5.2.10/7)因为数组的对齐要求不能比元素的对齐要求更严格。

好吧,如果我是你,我会打开标准并阅读.FWIW,我认为这是合法的。但是我是Ruby开发者,我知道什么?:-)我相信是的,因为你可以在指针中获取数组的地址并使用该指针访问元素0,然后您可以增加该指针以访问数组中其余的每一个元素,或者将该指针用作数组本身。(i=p[5])但我撤销了我的答案,并将其转换为注释,因为我的信念不可能对抗一个家伙(@Armen Tsirunyan)32.7k的声誉引用了该标准。只需注意:模板在编译时解析,类型是您强制转换的类型,独立于
p
,即您将从
任何(*(double(*)[10])0获得相同的输出
这与转换是否有意义完全无关。因此,我们可以将指向数组的指针视为指向第一个元素的指针,但我们不能将指向第一个元素的指针视为指向数组的指针吗?或者这两者都不是选项吗?好吧,那么
int(*b)[10];copy(&p,&p+sizeof(p),&b)呢;
?@R.MartinhoFernandes:两者都不是option@KerrekSB:我不确定这一点,我认为这根本不是未定义的行为。该强制转换是一个
重新解释\u强制转换
,因此是未指定的(而不是未定义的行为),因此您有一个证据,但它不符合此页边距?;-)