Можно ли создать переменные типа initializer_list
, например, аргументы функции (см. Функцию test
)? Код ниже работает, и ни clang, ни gcc не жалуются ни на что, но я просто хотел бы убедиться, что все в порядке.Список инициализаторов переменных
редактировать: изменения аргумента wrap
к константной исх
#include <iostream>
#include <initializer_list>
template <class T>
struct array
{
T *ptr;
size_t len;
array() { clear(); }
array(T *p, size_t l) { assign(p,l); }
inline void clear() { ptr=nullptr; len=0; }
inline void assign(T *p, size_t l) { ptr=p; len=l; }
inline T& operator[] (size_t i) const { return ptr[i]; }
};
template <class T>
inline array<const T> wrap(const std::initializer_list<T>& lst)
{ return array<const T>(lst.begin(), lst.size()); }
void test(int a, int b, int c)
{
auto ar = wrap({a,b,c});
std::cout<< ar[2] << std::endl;
}
int main()
{
auto a = wrap({1,2,3});
std::cout<< a[2] << std::endl;
test(1,2,3);
}
Боковой вопрос; если я попытаюсь вернуть мой завернутый массив в test
, список инициализаторов {a,b,c}
выйдет из области видимости, и массив, который я возвращаю, будет недействительным - это правильно?
Я считаю, что использовать определение 'inline' в определении шаблона бесполезно. Я думаю, что я также помню из «Стандартов кодирования C++» Sutter и Alexandrescu, что часто бесполезно объявлять функции inline, так как это только указание для компилятора, и чаще всего компилятор умнее вас. –