В стандарте С++ 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;
}