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

Решение о дизайне std:: array fill

std::array в С++ 11 - полезный класс, который предоставляет интерфейс С++ Container над массивом стека C.

Но почему std::array не имеет типичного конструктора заполнения, который имеет большинство контейнеров? Вместо этого он имеет метод fill.

Есть ли какая-то причина, почему std::array является уникальной среди контейнеров STL в этом отношении?

4b9b3361

Ответ 1

Из раздела 23.3.2.1:

Массив - это агрегат (8.5.1), который может быть инициализирован синтаксисом array a = {initializer-list};

Если он работал как std::vector, это не было бы POD. Кроме того, из этого же раздела:

Условия для агрегата (8.5.1) должны быть выполнены.

Эти условия:

Агрегат - это массив или класс (раздел 9) без каких-либо конструкторов, предоставляемых пользователем (12.1), без привязки или выравнивания для нестатических членов данных (9.2), нет частных или защищенных нестатических данных (раздел 11), нет базовых классов (раздел 10) и нет виртуальных функций (10.3).

Ответ 2

Да; std::array означает агрегат (С++ 11 §8.5.1), так что at может использоваться как можно больше контекстов, где может использоваться простой массив. У агрегата не может быть явных конструкторов или деструкторов.

Ответ 3

Все объясняли "почему", я думаю, так, что я просто подниму предложение обходных решений, которое должно компилироваться так же хорошо, как собственный конструктор:

template< typename T, std::size_t n > std::array<T,n> filledArray( const T& v ) {
    std::array<T,n> r;
    r.fill( v );
    return r;
}

auto arr = filledArray<int,4>( 7 );