以下作品:
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)
| 归档时间: |
|
| 查看次数: |
765 次 |
| 最近记录: |