reinterpret_cast в массив переменного размера

Итак, похоже, что я могу использовать 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?


person rampion    schedule 21.10.2016    source источник
comment
VLA — это функция C99, опционально поддерживаемая g++, и clang, как подключаемый модуль, заменяющий g++, также их поддерживает. Но это означает, что вам нужно обращаться к документации компилятора, а не к стандарту C++. Соответственно я добавил тег clang.   -  person Cheers and hth. - Alf    schedule 21.10.2016


Ответы (1)


Из этот ответ похоже, что одним из решений является использование локального 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);

  // ...
}
person rampion    schedule 21.10.2016