Стандартные контейнеры обычно могут быть построены с использованием диапазонов из других контейнеров, указанных парами итераторов. Рассмотрим следующий пример:
#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())
, который вы можете найти в старом коде. Это также работает между различными видами контейнеров, при условии, что содержащиеся в них элементы совместимы.