【问题标题】:how convert std::array<char, N> to char (&dest)[N]?如何将 std::array<char, N> 转换为 char (&dest)[N]?
【发布时间】:2018-12-27 15:18:00
【问题描述】:

std::array&lt;char, N&gt; 的传递方式是什么 这样的功能:

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), 我遇到了错误的参考?

【问题讨论】:

  • 我看不到这个问题,但你可能想通读一下:stackoverflow.com/questions/41463005/…
  • 你可以简单地 reinterpret_cast 引用:它会更短,更不容易出错。但同样,这种编程是危险的。如果元素类型和类型的大小不匹配,您不会注意到,但会造成伤害。

标签: c++ arrays c++11 reinterpret-cast stdarray


【解决方案1】:

一种方式:

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() 返回的指针。由于聚合的地址与其第一个成员的地址一致,因此调用和取消引用 std::array::data() 并不是绝对必要的,reinterpret_cast&lt;T(&amp;)[N]&gt;(a) 也可以正常工作。

std::array 起源于boost,其唯一目的是为内置数组T[N] 提供标准容器接口(@98​​7654330@),仅此而已,因此它没有任何开销, 0 成本抽象。因此,您基本上可以来回转换boost::array&lt;T, N&gt; 和T[N],尽管这样做可能会破坏别名规则(编译器假定boost::array&lt;T, N&gt; 和T[N] 指的是不同的对象,因此您需要知道如何应对在你的具体情况下)。

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

【讨论】:

  • 次要挑剔:标准在哪里说std::array 包含T[N]?
  • @geza 该标准说它是一个聚合,它是多个元素的连续存储。除了T[N] 之外,没有任何东西符合这个描述。
  • 当然可以,但是我没有在标准中找到std::array 包含T[N]。它可以是任何东西,而不仅仅是可访问的常用类型(例如,NULL 没有定义,它到底是什么)。但这只是吹毛求疵,因为std::array 肯定是作为T[N] 实现的,否则没有任何意义。
  • @geza 我在第一条评论中解释了为什么考虑到标准要求,它只能是T[N]。您可能希望指定另一种满足要求的类型来支持您的它可以是任何东西 声明。
  • 我喜欢这个答案如何一口气总结了有关 C++ 的历史和 MO 的所有内容,同时还以实用和合法的方式回答了这个问题。最高分:D
猜你喜欢
  • 2012-06-09
  • 2017-05-31
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多