【问题标题】:What is the use of 0-length array (or std::array)?0 长度数组(或 std::array)有什么用?
【发布时间】:2014-11-30 07:07:57
【问题描述】:

在 C++11 中,它允许您像这样创建 0 长度 C 数组和 std:array

int arr1[0];
std::array arr2<int,0>;
  1. 所以我在想没有空间存储的数组有什么用?
  2. 其次,什么是零长度数组?如果是指针,它指向哪里?

【问题讨论】:

  • 不,C++ 不允许零长度数组。即使有,也不是指针。
  • @NayanaAdassuriya:是的,许多编译器(包括 GCC)都有扩展。如果您想坚持符合标准的代码,请使用-pedantic(甚至-pedantic-errors)进行编译。
  • 长度为 0 的数组确实有一个指针。只是不要尝试给它写信。
  • @MikeSeymour:没有零长度数组type。但是,肯定有零长度数组:new int[0] 是有效的。

标签: c++ arrays stdarray


【解决方案1】:

您的第一个示例不是标准 C++,而是 an extensiongccclang 都允许,它是 flexible arrays 的版本,这个 answer to the question: Are flexible array members really necessary? 解释了此功能的许多优点。如果您使用-pedantic 标志进行编译,您将在gcc 中收到以下警告:

警告:ISO C++ 禁止零大小数组 'arr1' [-Wpedantic]

以及clang 中的以下警告:

警告:零大小数组是扩展 [-Wzero-length-array]

至于您的第二种情况,零长度 std::array 允许更简单的通用算法,而不必为 零长度 特殊情况,例如 size_t 类型的模板非类型参数。正如cppreference section for std::array 所说,这是一种特殊情况:

零长度数组(N == 0)有一种特殊情况。在这种情况下,array.begin() == array.end(),这是一个独特的值。在大小为零的数组上调用 front() 或 back() 的效果是未定义的。

这也会使其与其他sequence containers 一致,也可以是empty

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2020-05-20
    • 2018-02-13
    相关资源
    最近更新 更多