容器std::array
等效地是一个包含 C 数组的结构(实现可能未实现std::array
这样,但要保证语义相同),所以应该用两层大括号初始化,即
#include <array>
std::array<std::array<double,2>,2> f() {
return {{{{0,0}},{{0,0}}}};
}
当然,初始化列表中的大括号可以像我们通常对二维数组所做的那样省略:
int arr[2][2] = {0,1,2,3};
...但是在省略之前以省略的大括号开头的初始值设定项列表不应在省略之后以左大括号开头。换句话说,如果初始值设定项列表以左大括号开头,则编译器将不会考虑该初始值设定项列表已省略最外层大括号的可能性。
在你的初始化程序中{{0,0},{0,0}}
, 子初始化器{0,0},{0,0}
以左大括号开头,因此它用于初始化 C 数组本身。然而,列表中有两个子句,而只有一个 C 数组,则会出现错误。
在你的初始化程序中{std::array<double,2>{0,0},{0,0}}
, 子初始化器std::array<double,2>{0,0},{0,0}
不以左大括号开头,因此可以用来初始化 C 数组的元素,这是可以的(递归地,{0,0}
可以初始化一个std::array<double,2>
因为子初始化器0,0
不以左大括号开头)。
一个建议:使用大括号的省略规则,您可以省略所有内部大括号,就像我们通常对二维数组所做的那样:
#include <array>
std::array<std::array<double,2>,2> f() {
return {0,0,0,0};
}