提前说明:我知道在这里要求你做的事情并不是一个好主意。这只是出于一种病态的语言好奇心所产生的问题,并非实际使用需要。我在这里应用的规则完全是任意的。
假设我们有一个函数,其精确定义如下。不能将其更改为除此以外的任何东西,不能使用模板或函数重载。该函数的实现也不能更改(可以视为未知),但是我们知道参数被用作输出参数。
void my_func(int (&arr)[10]);
在另一个函数中,我们动态分配了一个数组。 这个分配也不能改变,我们不允许在栈上分配。 也不允许进行进一步的分配。
int* my_arr = new int[10];
有没有可能以某种方式调用my_func
并传递my_arr
?换句话说,有没有办法欺骗类型系统,使其将my_arr
视为数组而不是指针?
朴素的转换无法解决问题,它们都导致编译错误:
my_func((int[10])my_arr);
my_func(static_cast<int[10]>(my_arr));
my_func(reinterpret_cast<int[10]>(my_arr));
另一点说明:我想欺骗类型系统。我不想从堆栈数组等处复制数据。为什么?再次强调:出于病态好奇心。
my_func(reinterpret_cast<(int[10])&>(*my_arr));
不起作用。这个别名似乎不仅更容易阅读,而且在技术上也是必需的。为什么呢? - Brotcrunsherint(&)[10]
,类型中的(&)
告诉编译器&
或者引用应用于int[10]
。使用int&[10]
是行不通的,因为那将是一个引用的数组,这是不允许的。(int[10])&
也不起作用,因为就 C++ 语法而言,它是错误的。 - NathanOliver