编译下面的代码时,我在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) 我正在编译使用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++ 代码:
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 中到底无法理解什么。