reinterpret_cast到一个可变大小的数组

时间:2016-10-21 13:00:53

标签: c++ clang 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]'

  //...
}

这是一个非常令人困惑的错误消息,所以我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的有效显式类型吗?

1 个答案:

答案 0 :(得分:0)

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

  // ...
}