如何将 std::array<char, N> 转换为 char (&dest)[N]?

how convert std::array<char, N> to char (&dest)[N]?

std::array<char, N>的方法是什么 这样的功能:

template<size_t N>
void safe_func(char (&dest)[N]);

?

我试试这个:

#include <array>

template <size_t N> using SafeArray = char[N];

template <size_t N> void safe_func(char (&dest)[N]) {}

int main() {
  SafeArray<10> a1;
  safe_func(a1);
  std::array<char, 10> a2;
  safe_func(*static_cast<SafeArray<10> *>(static_cast<void *>(a2.data())));
}

它有效,但我怀疑,可能是我的演员有问题, 在其他编译器或平台上(我使用 gcc/linux/amd64), 我遇到了错误的参考资料?

一种方式:

template<class T, size_t N>
using c_array = T[N];

template<class T, size_t N>
c_array<T, N>& as_c_array(std::array<T, N>& a) {
    return reinterpret_cast<T(&)[N]>(*a.data());
}

int main() {
    std::array<int, 2> a;
    int(&b)[2] = as_c_array(a);
}

标准要求 std::array 是一个 aggregate,它的唯一成员是 T[N],一个指向 std::array::data() returns 的指针。由于聚合的地址与其第一个成员的地址一致,调用和取消引用 std::array::data() 并不是绝对必要的,reinterpret_cast<T(&)[N]>(a) 也可以。

std::array 起源于 boost,其唯一目的是为内置数组 T[N] 提供标准容器接口 (begin/end/size/empty/etc.),仅此而已,这样它就没有任何开销,0 成本的抽象。因此,您基本上可以来回转换 boost::array<T, N>T[N],尽管这样做可能会违反别名规则(编译器假定 boost::array<T, N>T[N] 指的是不同的对象,所以你需要知道在你的具体情况下如何应对。

该标准放弃了所有基本原理,并以非常软弱和模糊的术语表达了 std::array 的要求。所以人们想知道它是否真的只有 T[N] 成员在那里,而不是一些据称满足要求的外星类型。