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]'

  //...
}

如果 nm 在编译时已知,编译器对显式类型非常满意,我猜这与它有关。

我可以给出任何有效的显式类型吗a

this answer 开始,似乎一种解决方案是使用本地 typedefusing:

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);

  // ...
}