首页 > 解决方案 > 为什么在定义一对数组时需要额外的一对花括号?

问题描述

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

我想在 C++ 中定义一个std::arrayof std::pairs 来存储 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}}
    }
};

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

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{
    {sf::IntRect{2,3,1,2}, sf::IntRect{4,1,3,2}}
};

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

这些花括号在做什么?我无法想象他们需要什么。

标签: c++arrays

解决方案


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

template <typename T, std::size_t N>
class array {
  T arr[N];
  ...
};

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

std::array<T, N> array = {{ t0, t1, t2 }};

外部{}用于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}}
};

如下重新格式化时,错误更加明显。

std::array<std::pair<sf::IntRect, sf::IntRect>, 1> aliens{{
  sf::IntRect{2,3,1,2},
  sf::IntRect{4,1,3,2}
}};

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


推荐阅读