为什么在定义对数组时需要额外的花括号对?

OOP*_*dio 5 c++ arrays

很抱歉,如果这是一个常见问题,我不知道如何搜索它,所以我认为最好只是问一下。

我想在 C++ 中定义一个std::arrayofstd::pair来存储 SFML sf::IntRects。我搞砸了大约 10 分钟,最后意识到这个可以编译:

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
    {
        {sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么我需要在这对本身周围加上一组额外的大括号?当我把它们带走时:

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
    {sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};
Run Code Online (Sandbox Code Playgroud)

我收到一个错误No suitable user-defined conversion from "sf::IntRect" to "std::pair<sf::IntRect,sf::IntRect>" exists

这些大括号是做什么的?我无法想象他们需要做什么。

Lin*_*gxi 5

std::array是内置 C 样式数组的包装模板。你可能会认为它是这样的

template <typename T, std::size_t N>
class array {
  T arr[N];
  ...
};
Run Code Online (Sandbox Code Playgroud)

std::array内置的 C 风格数组都是聚合类型。您可以使用聚合初始化语法对其进行初始化。会是这样的

std::array<T, N> array = {{ t0, t1, t2 }};
Run Code Online (Sandbox Code Playgroud)

外部{}用于std::array其自身,而内部{}用于包装的内置 C 样式数组。

看看你的例子

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
    {sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};
Run Code Online (Sandbox Code Playgroud)

当如下重新修改时,错误更加明显。

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{{
  sf::IntRect{2,3,1,2},
  sf::IntRect{4,1,3,2}
}};
Run Code Online (Sandbox Code Playgroud)

您正在尝试用单个sf::IntRect对象初始化一对。