Программа:
#include<vector>
int main() {
std::vector<int>::size_type size=3;
std::vector<int> v{size};
}
при компиляции с
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
генерирует ошибку:
ppp.cpp: In function ‘int main()’:
ppp.cpp:5:28: error: narrowing conversion of ‘size’ from ‘std::vector<int>::size_type {aka long unsigned int}’ to ‘int’ inside { } [-fpermissive]
ppp.cpp:5:28: error: narrowing conversion of ‘size’ from ‘std::vector<int>::size_type {aka long unsigned int}’ to ‘int’ inside { } [-fpermissive]
и на http://www.cplusplus.com/reference/stl/vector/vector/ это написано
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
Я ожидал, что этот конструктор будет использоваться.
Может кто-нибудь объяснить?
Вы не вызываете конструктор, который устанавливает вектор в начальный размер.
std::vector<int> v{size};
Вышеуказанное создает vector
содержащий один int
элемент со значением size
, Вы вызываете этот конструктор:
vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
Список braced-initializer выводится как std::initializer_list<size_type>
а затем должно быть выполнено сужающее преобразование, так как vector
сам содержит int
s.
Чтобы установить начальный размер вектора, используйте:
std::vector<int> v(size); // parentheses, not braces
Так же vector
указанный вами конструктор больше не существует, он был удален в C ++ 11 и заменен следующими двумя конструкторами:
vector( size_type count, const T& value, const Allocator& alloc = Allocator());
explicit vector( size_type count );
cppreference.com это гораздо лучшая ссылка по сравнению с cplusplus.com.
Других решений пока нет …