是否可以初始化未命名结构的std ::数组?

Rol*_*lie 7 c++

以下作品:

struct
{
    int v;
} vals[] = { {1}, {2} };
Run Code Online (Sandbox Code Playgroud)

我可以做同样的事情,而是初始化一个std::array

编辑,因为很多人都在问'为什么'

有一些非常明显的解决方法(在评论中列出),但我只想使用一次类型,所以我真的不希望它添加到我当前的命名空间.我可以使用元组或类似的东西,但具有命名值可以提高清晰度.如果我正在构建一个std::array,我不需要c-array值,所以我不能使用decltype.

想要做的最干净的解决方案是:

struct
{
    int v;
} std::array vals = { {1}, {2} };
Run Code Online (Sandbox Code Playgroud)

还有一个学术兴趣的元素 - "这有可能以某种方式我没有吗?".似乎没有,所以我可能会使用:

struct
{
    int v;
} c_array[] = {};

std::array<std::remove_reference_t<decltype(c_array[0])>, 2> arr = { {1}, {2} };
Run Code Online (Sandbox Code Playgroud)

小智 5

你做不到的原因:

std::array<struct {int v}, 10> arr;
Run Code Online (Sandbox Code Playgroud)

是因为 N4140 的以下规则:

§7.1.6/3 [...]类型说明符序列不应定义类或枚举,除非它出现在 不是模板声明别名声明(7.1.3)的类型 ID-声明

由于模板类型参数是使用type-id指定的,并且type-id包含一个type-specifier-seq,因此它不能是类的定义。

您可以使用 typedef,但是:

§9.1/5命名类类型或其 cv 限定版本的typedef-name (7.1.3) 也是class-name。[...]

我会同意TC的建议:

struct { int v; } foo; std::array<decltype(foo), 10> bar = {{{1},{2}}};
Run Code Online (Sandbox Code Playgroud)

  • 该异常指的是`using T = struct { int v; };` - 一个 *alias-declaration*,它不是别名模板声明的一部分。原因是他们想要在 `using` 和 `typedef` 之间精确匹配。 (2认同)