В комментариях, которые вы упоминаете, это необходимо для инициализации вектора в списке инициализатора члена.
Вы можете делегировать конструкцию функции или лямбде в списке инициализатора члена:
some_constructor(...) : myVector([]{
std::vector<int> vec(3);
myVector[indexOfInterest] = 999;
return vec;
}()) {
}
Вы также можете написать себе обобщенную c функцию для задачи, например:
template<typename T, std::size_t N>
std::vector<T> make_vector(typename std::vector<T>::size_type size, const T& value, std::pair<typename std::vector<T>::size_type, T>(&&entries)[N]) {
std::vector<T> vec(size, value);
for(auto& entry : entries)
vec[entry.first] = std::move(entry.second);
return vec;
}
template<typename T, std::size_t N>
std::vector<T> make_vector(typename std::vector<T>::size_type size, std::pair<typename std::vector<T>::size_type, T>(&&entries)[N]) {
return make_vector<T>(size, {}, entries);
}
Это можно использовать в инициализаторе члена, например, так:
some_constructor(...) : myVector(make_vector(3, 0, {{indexOfInterest, 999}})) {
}
или
some_constructor(...) : myVector(make_vector<int>(3, {{indexOfInterest, 999}})) {
}
со второй перегрузкой.
Вместо массива вы также можете принять аргумент в качестве std::initializer_list<...>
с той разницей, что создается версия массива новые функции для каждого размера списка, данного вызову, в то время как список инициализатора будет использовать одну и ту же функцию для разных размеров списка.
Функция в любом случае не копирует построенный вектор. Однако он может перемещать его один раз (C ++ 17, из-за обязательного удаления копии, за исключением vec
в возвращаемое значение) или несколько раз (до C ++ 17). Все эти могут , однако, могут быть оптимизированы компилятором из-за оптимизации (именованного) возвращаемого значения .