C 数组在 C++ 中的语法上有些难以理解,可能需要一些时间来适应。虽然一维数组衰减为指针:
void fn1(int x[2]) {}
void fn2(int*x) {}
fn1()
并fn2()
具有相同的功能签名。
数组实际上确实具有包含数组中有多少元素的类型。如:
void fn(int (&)[2]) {}
fn()
将只接受一个 2 元素 int 数组。
问题是,我只能看到固定数量的元素的数组只能由堆栈、文件范围或具有该签名的结构/类分配生成:
int twoElementArray[2];
如果我要在堆上动态分配它,我似乎无法获得相同的签名。我以为我可以投射它,但没有成功:
int (&array)[2] = reinterpret_cast<int(&)[2]>(new int[2]); // FAIL!
关于如何实现这一点的任何想法?
编辑:虽然我选择了一个答案,但它实际上并没有投射任何东西,而是使用了一种绝对比投射更好的方法(如果不需要 IMO,最好不要投射)。然而,它在技术上并没有回答这个问题,因为问题询问是否有“一种将指针转换为数组类型的方法?” 答案是肯定的。
int (&array)[2] = *reinterpret_cast<int(*)[2]>(new int[2]); // SUCCESS!
请注意,我不一定建议这样做,但它确实回答了这个问题。如果我需要将指针转换为数组类型,那将是如何做到的。阅读选择的答案以获得更好的解决方案operator new[]
。