我能逆转数组到指针衰减的过程吗?
Can I reverse the process of array-to-pointer decay?
将指向数组第一个元素的指针强制转换为指向整个数组的指针是否合法?
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),因为数组的对齐要求不能比元素的对齐要求更严格。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- clang 插件:在编译过程中修改 AST
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 在C++中调用 MS SQL 存储过程
- 阻塞信号会导致升压过程不起作用
- 为什么这些函数不衰减到函数指针?
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 使用提升过程获取 shell 命令的标准输出
- 附加到 gdb 会中断并且不会继续该过程
- 如何创建始终在线的过程?
- 使用 Qt 测量过程的实际运行时间
- 如何在窗口过程方法中检测击键?
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- 如何在此功能中没有通信过程?
- 更改用于部署的凭据提供程序 GUID 的过程
- 我能逆转数组到指针衰减的过程吗?