В стандарте C ++ 11, раздел 23.3.6.2 [vector.cons], сказано следующее:
template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());
9 Эффекты : создает векторравен диапазону [first,last)
, используя указанный распределитель.
10 Сложность : делает только N вызовов конструктора копирования T (где N - расстояние между first
и last
)и никакие перераспределения, если итераторы первый и последний относятся к категориям прямого, двунаправленного или произвольного доступа.Он делает вызовы порядка N для конструктора копирования из T и перераспределения log (N), если они являются просто входными итераторами.
(этот текст также существует в более старом стандарте)С одной стороны, не требуется, чтобы разыменование InputIterator
приводило к значению того же типа, которое хранится в векторе.С другой стороны, он говорит об использовании конструкторов копирования, что подразумевает один и тот же тип.
Мой вопрос : допустимо ли использовать последовательность элементов другого типа с этимконструктор, при условии, что преобразование между типами возможно?Ссылки на стандарт желательны.
Например, следующий код прекрасно работает на ideone .Это гарантировано стандартом, или только GCC позволяет это сделать?
#include <vector>
#include <iostream>
struct A {
int n;
A(int n_) : n(n_) {}
};
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
std::vector<int> int_vec(arr, arr+10);
std::vector<A> A_vec(int_vec.begin(), int_vec.end());
for( std::vector<A>::iterator it=A_vec.begin(); it!=A_vec.end(); ++it )
std::cout<< it->n <<" ";
std::cout<<std::endl;
}