将std:set <int32_t>复制到std :: set <uint32_t>的好方法

NXT*_*NXT 4 c++ stl

uint32_t和int32_t之间存在隐式转换.发现我不能说:我有点惊讶:

void somefunc(std::set<uint32_t> arg);

std::set<int32_t> ary1;
somefunc(ary1);
Run Code Online (Sandbox Code Playgroud)

为什么是这样?有没有一个简短的语法来做到这一点,而没有写出一个for循环将第一个int32_t数组复制到一个临时的uint32_t数组?

谢谢.

Fra*_*eux 6

标准容器通常可以使用来自其他容器的范围来构造,这些容器由成对的迭代器指定.请考虑以下示例:

#include <cstdint>
#include <set>

void foo(std::set<uint32_t> arg) {}

int main()
{
    std::set<int32_t> x;
    foo({ x.begin(), x.end() });
}
Run Code Online (Sandbox Code Playgroud)

foo期待一个std::set<uint32_t>但是x是一个std::set<int32_t>.{x.begin(), x.begin()}正在创建一个std::set<uint32_t>复制所有值的新临时文件x.它与std::set<uint32_t>(x.begin(), x.end())您在旧代码中可能会发现的类似.如果包含的元素兼容,这也适用于不同类型的容器.

  • 为了清楚起见,你仍然可以有效地制作你的套装的*副本*.这只是简洁的语法. (3认同)