Подтвердить что ты не робот

Почему std:: array не имеет конструктора, который принимает значение для массива, который должен быть заполнен?

Является ли отсутствие

std::array<T,size>::array(const T& value);

надзор? Мне кажется очень полезным для меня, а динамические контейнеры (например, std::vector) имеют похожий конструктор.

Я полностью осведомлен о

std::array<T,size>::fill(const T& value);

но это не конструктор, и сначала память будет обнулена. Что делать, если я хочу, чтобы все -1 как этот парень?

4b9b3361

Ответ 1

std::array является, по своему усмотрению, агрегатом, поэтому он не имеет конструкторов, объявленных пользователем.

Как вы говорите, вы можете использовать fill после построения по умолчанию. Поскольку это совокупность, по умолчанию конструкция не будет обнулять память, но оставит ее неинициализированной (если содержащийся тип тривиально инициализируется).

Ответ 2

Обратите внимание, что вы можете эффективно имитировать этот тип конструктора, используя тот факт, что массив не инициализируется нулем и имеет конструктор копирования и делает.

template <size_t N, class T>
array<T,N> make_array(const T &v) {
    array<T,N> ret;
    ret.fill(v);
    return ret;
}

auto a = make_array<20>('z');

Ответ 3

Прежде всего, это не std::array<T>, это std::array<T,N>, где N - интегральное выражение постоянной времени компиляции.

Во-вторых, std::array создается агрегатом по дизайну. Таким образом, он не имеет ничего, что делает его не агрегированным, поэтому у него нет конструктора... и деструктора, виртуальных функций и т.д.

Ответ 4

Вы можете использовать std::index sequence для этого:

namespace detail
{

    template <typename T, std::size_t...Is>
    std::array<T, sizeof...(Is)> make_array(const T& value, std::index_sequence<Is...>)
    {
        return {{(static_cast<void>(Is), value)...}};
    }
}

template <std::size_t N, typename T>
std::array<T, N> make_array(const T& value)
{
    return detail::make_array(value, std::make_index_sequence<N>());
}

демонстрация

std::make_index_sequence - это С++ 14, но может быть реализован на С++ 11.