我想写可以这样使用的编译时的valarray:constexpr阵列和std :: initializer_list
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, "");
我设法用下面的实施做到这一点,它工作正常(与海湾合作委员会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
及其底层数组在编译时的行为。
好的,谢谢,我找不到任何关于寿命:) 我已经知道了'constexpr'标准的revelant一部分,这就是为什么我跟这没有只得到了建议,但也对N3471被录取了。 – Morwenn 2013-04-11 06:37:57