下面的作品:
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} };
您无法执行的原因:
std::array<struct {int v}, 10> arr;
是由于N4140遵循以下规则:
§7.1.6/ 3 [...] type-specifier-seq不应定义类或枚举,除非它出现在不是模板声明的别名声明(7.1.3)的type-id中-声明。
由于模板类型参数是使用type-id指定的,并且type-id包含type-specifier-seq,因此它不能是类的定义。
您可以使用typedef,但是:
§9.1/ 5命名类类型或其cv限定版本的typedef名称(7.1.3)也是类名称。[...]
我会同意TC的建议:
struct { int v; } foo; std::array<decltype(foo), 10> bar = {{{1},{2}}};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句