在uint32_t和int32_t之间存在隐式转换。我惊讶地发现我不能说:
void somefunc(std::set<uint32_t> arg);
std::set<int32_t> ary1;
somefunc(ary1);
这是为什么?是否有一种简短而甜美的语法而无需编写for循环即可将第一个int32_t数组复制到临时uint32_t数组中?
谢谢。
答案 0 :(得分:6)
通常可以使用其他容器的范围(由成对的迭代器指定)来构造标准容器。考虑以下示例:
#include <cstdint>
#include <set>
void foo(std::set<uint32_t> arg) {}
int main()
{
std::set<int32_t> x;
foo({ x.begin(), x.end() });
}
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())
。只要所包含的元素兼容,这在不同种类的容器之间也适用。