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

时间:2015-02-13 08:13:41

标签: c++

以下作品:

struct
{
    int v;
} vals[] = { {1}, {2} };

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

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

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

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

struct
{
    int v;
} std::array vals = { {1}, {2} };

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

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

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

1 个答案:

答案 0 :(得分:4)

你无法做到的原因:

std::array<struct {int v}, 10> arr;

是因为N4140的以下规则:

  

§7.1.6/ 3 [...] type-specifier-seq 不得定义类或   枚举,除非它出现在 alias-declaration type-id 中   (7.1.3)不是a的声明   模板声明

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

您可以使用typedef,但是:

  

§9.1/ 5 typedef-name (7.1.3),用于命名类类型,或者   cv限定版本,也是类名。 [...]

我会接受T.C.的建议:

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