tablica constexpr i std :: initializer_list
Próbowałem napisać kompilację, która mogłaby zostać użyta w następujący sposób:
constexpr array<double> a = { 1.0, 2.1, 3.2, 4.3, 5.4, 6.5 };
static_assert(a[0] == 1.0, "");
static_assert(a[3] == 4.3, "");
static_assert(a.size() == 6, "");
Udało mi się to zrobić za pomocą następującej implementacji i działa dobrze (z GCC 4.7):
#include <initializer_list>
template<typename T>
struct array
{
private:
const std::size_t _size;
const T* _data;
public:
constexpr array(std::initializer_list<T> values):
_size(values.size()),
_data(values.begin())
{}
constexpr auto operator[](std::size_t n)
-> T
{
return _data[n]
}
constexpr auto size() const
-> std::size_t;
{
return _size;
}
};
Mimo że działa dobrze dla mnie, nie jestem pewien co do zachowaniastd::initializer_list
i mogą korzystać z niektórych, które są niezdefiniowanym zachowaniem.
constexpr
dlastd::initializer_list
konstruktor,begin
isize
jest w porządku, nawet jeśli nie mówi ściśle C ++ 11 od czasu, gdy N3471 został niedawno zaadaptowany i osiągnął standard.
Jeśli chodzi o niezdefiniowane zachowanie, nie jestem pewien, czy podstawowa tablicastd::initializer_list
będzie żył, a jeśli nie, to czy istnieje sposób, aby żyć dłużej niż tylkoarray's
konstruktor. Co myślisz?
EDYTOWAĆ: Mogę nie być jasne, ale tak naprawdę nie obchodzi mnie rzeczywista tablica. To, co naprawdę mnie interesuje, to zachowaniestd::initializer_list
i jego podstawowa tablica w czasie kompilacji.