reinterpret_cast 到可变大小的数组
reinterpret_cast to a variable-sized array
所以我似乎可以使用 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
?
从 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);
// ...
}
所以我似乎可以使用 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
?
从 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);
// ...
}