Решение о дизайне std:: array fill
std::array
в С++ 11 - полезный класс, который предоставляет интерфейс С++ Container над массивом стека C.
Но почему std::array
не имеет типичного конструктора заполнения, который имеет большинство контейнеров? Вместо этого он имеет метод fill
.
Есть ли какая-то причина, почему std::array
является уникальной среди контейнеров STL в этом отношении?
Ответы
Ответ 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 );