我想寫可以這樣使用的編譯時的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