Итак, похоже, что я могу использовать 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]'
//...
}
Это довольно запутанное сообщение об ошибке, поэтому я использовал decltype
, чтобы заставить компилятор сообщить мне, какой, по его мнению, тип был:
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
?
clang
. - person Cheers and hth. - Alf   schedule 21.10.2016