我试图编写一个可以像这样使用的编译时 valarray:
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, "");
我设法通过以下实现来做到这一点,并且效果很好(使用 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;
}
};
即使它对我来说效果很好,但我不确定它的行为std::initializer_list
并且可能会使用一些未定义的行为。
constexpr
对于std::initializer_list
构造函数,begin
即使size
它不是严格意义上的 C++11 也很好,因为 N3471 最近被采用并达到了标准。
关于未定义的行为,我不确定底层数组是否std::initializer_list
会存活,是否有办法让它比array's
构造函数存活得更久。你怎么看?
编辑:我可能不清楚,但我并不真正关心实际的数组。我真正感兴趣的是std::initializer_list
编译时的行为及其底层数组。