你的演员表是错误的。您正在转换存储在第一个数组元素中的 unsigned char * 指针。您需要转换元素本身的地址:
f(reinterpret_cast<unsigned char **>(&myArray[0]));
或者甚至转换数组本身:
using puchar = unsigned char *;
f(reinterpret_cast<puchar(&)[4]>(myArray));
但是,这些只是因为std::unique_ptr 被设计为没有比原始指针更多的存储开销。但是使用这些解决方案是未定义的行为。正确的解决方案是简单地将指针复制到另一个数组,例如:
unsigned char* myArrayOfPtrs[] = { myArray[0].get(), myArray[1].get(), myArray[2].get(), myArray[3].get() };
f(myArrayOfPtrs);
或者:
unsigned char* myArrayOfPtrs[4];
for (int i = 0; i < 4; ++i) {
myArrayOfPtrs[i] = myArray[i].get();
}
f(myArrayOfPtrs);
或者:
#include <algorithm>
unsigned char* myArrayOfPtrs[4];
std::transform(std::begin(myArray), std::end(myArray), std::begin(myArrayOfPtrs),
[](auto &p) { return p.get(); }
);
f(myArrayOfPtrs);