В С++ 98 прототип конструктора заполнения std::vector
имеет значение по умолчанию для инициализатора.
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
С++ 11 использует два прототипа.
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
(В С++ 14 конструктор заполнения снова изменился, но это не точка этого вопроса.)
Ссылка здесь здесь.
Почему С++ 11 отказался от значения инициализатора по умолчанию value_type()
?
Кстати, я попытался скомпилировать следующий код с clang++ -std=c++11
, и он выпустил ошибку, а это значит, что тип значения по-прежнему должен иметь конструктор по умолчанию, например S() {}
, т.е. конструктивен по умолчанию.
#include <vector>
struct S {
int k;
S(int k) : k(k) {} // intentionally remove the synthesized default constructor
};
int main() {
std::vector<S> s(5); // error: no matching constructor
}