所以我似乎可以使用reinterpret_cast
告诉我的编译器(Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
)将指针视为数组数组:
void f(int *p, size_t n, size_t m) {
auto a = reinterpret_cast<int(&)[n][m]>(p);
//...
}
但是如果我给数组引用一个显式类型(为了确保我得到我想要的),我得到一个错误:
void g(int *p, size_t n, size_t m) {
int (&a)[n][m] = reinterpret_cast<int(&)[n][m]>(p);
// error: non-const lvalue reference to type 'int [n][m]'
// cannot bind to a value of unrelated type 'int [n][m]'
//...
}
这是一个非常令人困惑的错误消息,所以我used decltype
to get the compiler to tell me what it thought the type was:
template<class Type> struct S;
void h(int * p, size_t n, size_t m) {
auto a = reinterpret_cast<int (&)[n][m]>(p);
S<decltype(a)>();
// error: implicit instantiation of undefined template 'S<int (*)[m]>'
//...
}
但是那种使用类型也不起作用:
void i(int * p, size_t n, size_t m) {
int (*a)[m] = reinterpret_cast<int (&)[n][m]>(p);
// error: cannot initialize a variable of type 'int (*)[m]' with an lvalue
// of type 'int [n][m]'
//...
}
由于编译器对编译时已知n
和m
的显式类型非常满意,我猜这与它有关。
我可以提供a
的有效显式类型吗?
答案 0 :(得分:0)
从this answer开始,看起来一种解决方案是使用本地typedef
或using
:
void i(int * p, const size_t n, const size_t m) {
using n_by_m = int[n][m];
n_by_m &a = reinterpret_cast<n_by_m&>(p);
// ...
}