相关疑难解决方法(0)

何时可以在初始化列表中省略外括号?

编译下面的代码时,我在VC2010中遇到错误C2078.

struct A
  {
  int foo;
  double bar;
  };

std::array<A, 2> a1 = 
  // error C2078: too many initializers
  {
    {0, 0.1},
    {2, 3.4}
  };

// OK
std::array<double, 2> a2 = {0.1, 2.3};
Run Code Online (Sandbox Code Playgroud)

我发现正确的语法a1

std::array<A, 2> a1 = 
  {{
    {0, 0.1},
    {2, 3.4}
  }};
Run Code Online (Sandbox Code Playgroud)

问题是:为什么需要额外的括号a1但不是必需的a2

更新

这个问题似乎并不特定于std :: array.一些例子:

struct B
  {
  int foo[2];
  };

// OK
B meow1 = {1,2};
B bark1 = {{1,2}};

struct C
  {
  struct 
    { 
    int a, b; 
    } …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++-2010 c++11

47
推荐指数
1
解决办法
6797
查看次数

std :: array <std :: vector>中的brace elision

我正在编译使用g++C++ 17.我有以下内容:

std::array<std::vector<int>, 2> v = {{ {1,2}, {3,4} }};
Run Code Online (Sandbox Code Playgroud)

我不明白为什么如果我删除数组的双括号它不再工作.

std::array<std::vector<int>, 2> v = { {1,2}, {3,4} }; // Does not compile
Run Code Online (Sandbox Code Playgroud)

我理解一般是如何std::array工作和双括号的需要,但正如我正在编译C++ 17我期望支持elision发挥作用.

为什么括号不适用于此?

c++ list-initialization c++17

6
推荐指数
2
解决办法
263
查看次数

std::array 结构初始化器列表语法

考虑以下 C++ 代码:

struct My_Struct
{
  int a;
  int b;
};
Run Code Online (Sandbox Code Playgroud)

现在我想声明这些结构的常量 std::array :

选项A:

const std::array<My_Struct,2> my_array =
{
  {1,2},
  {2,3}
};
Run Code Online (Sandbox Code Playgroud)

选项B:

const std::array<My_Struct,2> my_array =
{
  My_Struct(1,2),
  My_Struct(2,3)
};
Run Code Online (Sandbox Code Playgroud)

问题:为什么选项A无法编译而只有选项B可以编译?初始化 std::array 时嵌套花括号有什么问题?

在我看来,编译器应该拥有成功编译选项 A 所需的所有信息,但它会产生“太多初始值设定项值”错误。

同时,嵌套花括号在初始化普通数组时效果非常好:

const My_Struct my_array[] =
{
      {1,2},
      {2,3}
};
Run Code Online (Sandbox Code Playgroud)

编译器是MSVC 17.2,C++20模式。

我可以接受选项 B,但我想了解在 C++ 知识方面我在选项 A 中到底无法理解什么。

c++ stdarray

0
推荐指数
1
解决办法
119
查看次数