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

  • 本文关键字:对花 定义 数组 c++ arrays
  • 更新时间 :
  • 英文 :


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

我想在c++中定义std::pairs的std::array来存储SFMLsf::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

这些花括号在做什么?我想象不出他们有什么用。

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对象初始化一对。

最新更新