以下作品:
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} };
答案 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}}};