std::array 嵌套初始值设定项

Bar*_*uch 7 c++ c++17

为什么这不能编译

#include <vector>
#include <array>

std::array<std::vector<const char*>, 2> s = {
  {"abc", "def"},
  {"ghi"}
};
Run Code Online (Sandbox Code Playgroud)

但这确实

#include <vector>
#include <array>

std::array<std::vector<const char*>, 2> s = {
  std::vector{"abc", "def"},
  {"ghi"}
};
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因std::vector第一个需要,为什么第二个不需要呢?

Ted*_*gmo 5

您需要一套额外的{... }

std::array<std::vector<const char*>, 2> s = { // #1
    {                                         // #2
        {"abc", "def"},                       // #3
        {"ghi"}                               // #4
    }
};
Run Code Online (Sandbox Code Playgroud)

尝试描述原因:

  • 内部初始化列表(#3 和 #4)转到第一个和第二个vector
  • #2 用于 . 中 C 风格数组的聚合初始化std::array。来自cppreference此容器是一个聚合类型,其语义与将 C 样式数组T[N]作为其唯一非静态数据成员的结构体具有相同的语义。
  • #1 是为了std::array它自己。

std::array<std::vector<const char*>, 2> s = {
  std::vector{"abc", "def"},
  {"ghi"}
};
Run Code Online (Sandbox Code Playgroud)

之所以有效,是因为初始化列表被推导为initializer_list<vector<const char*>>