Возьмите следующий код:
std::vector<std::vector<int>> v(10, 10);
Этот код не компилируется с libstdc ++. Однако он компилируется с библиотекой Visual Studio C ++. Я ожидал бы, что v
заполнен 10 векторами размера 10, и это то, что я получаю с Visual Studio.
Конструктор, вызываемый в Visual Studio, принимает два итератора. Сам конструктор определяется как:
template<class _Iter>
vector(_Iter _First, _Iter _Last)
: _Mybase()
{ // construct from [_First, _Last)
_Construct(_First, _Last, _Iter_cat(_First));
}
Существует две версии функции шаблона _Construct
. Оба имеют одинаковую сигнатуру, но один инициализирует вектор из диапазона, а другой инициализирует вектор с помощью N копий копии типа значения, созданной из второго параметра. В этом случае параметры шаблона действительны только для второй версии _Construct
.
В результате v
заполняется 10 копиями вектора, копия которого была построена из значения 10. Такой же путь к коду берется при его построении следующим образом, что вы должны сделать для того же эффекта, используя libstdc ++:
std::vector<int> temp(10);
std::vector<std::vector<int>> v(10, temp);
Какая реализация здесь верна? Это ошибка libstdc ++ или расширение библиотеки Visual Studio C ++?
Редактировать: Просто чтобы уточнить, я не спрашиваю, должен ли он вызывать конструктор диапазона. Я спрашиваю, какая реализация C ++ имеет правильное поведение, независимо от того, какой путь требуется для его достижения.