【问题标题】:How can I create an std::array of char array?如何创建 char 数组的 std::array?
【发布时间】:2018-02-09 14:56:34
【问题描述】:

我试图创建一个 char 数组的 std::array 以便我可以将其声明为静态 constexpr。

例如:

#include <array>

int main(){

  static constexpr char A[] = "abc";
  static constexpr char B[] = "def";
  static constexpr std::array<char[], 3> tmp{A, B};
}

当我这样做时,我收到错误消息“太多初始化器”

【问题讨论】:

  • 您的代码中没有std::array
  • @tkausl 更新
  • @DanielLangr 抱歉,应该是 A 和 B。
  • char[] 这里似乎对 std::array 无效

标签: c++11


【解决方案1】:

通过编译器的输出,我可以推测您有一个非标准扩展处于活动状态。严格按照 ISO 方式使用 char[] 作为模板的参数是不合法的。一些编译器会将其视为 char[0]。

你的数组打算存储什么?您尝试这样做的方式会将数组的地址存储到char(唯一的方法是将char[]替换为模板参数中的const char*std::array是一个简单的类,它静态存储数据,所以你不能以这种方式实现具有可变长度字符串的数组。

1) 废除 constexpr 并使用 std::string 2) 使用 const char* 3) 最坏的情况(有时是最好的) - 使用固定数组长度或带有聚合初始化列表的“裸”二维数组。

【讨论】:

  • 当我说它存储 char[] 为什么 std::array 试图存储地址?它不应该存储 char[] 吗?
  • @mike 取决于您使用的编译器。从您的输出来看,它将 char[] 视为 char[0] 并且无法存储您提供的文字。我用过的一个说法是 char[] 是非法的,并且符合 ISO 标准。所以 1)存储地址 2)存储字符串类 3)存储固定长度的数组。实际上可以使用 std::array 而不是 char[x]
【解决方案2】:

你可以使用:

static constexpr std::array<char[4], 2> tmp {{{ A[0], A[1], A[2], A[3] },
                                              { B[0], B[1], B[2], B[3] }}};

static constexpr std::array<char[4], 2> tmp { "abc", "def" };

来自http://en.cppreference.com/w/cpp/container/array

当初始化一个数组类型的对象时,初始化器必须是一个字符串字面量(可选地用大括号括起来)或者是一个为数组成员初始化的大括号括起来的列表。

因此,您不能通过另一个数组的对象来初始化一个数组(std::arraychar[4] 的成员)。

【讨论】:

    【解决方案3】:

    用C++20std::to_array可以用。

    static constexpr char A[] = "abc";
    static constexpr char B[] = "def";
    static constexpr auto tmp = std::to_array({A, B});
    

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2017-04-11
      • 2013-12-19
      • 2018-12-27
      • 2017-05-31
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多