Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1

Initializer_list: почему не пашет?

18.07.2018, 20:52. Показов 2490. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему не пашет? Для этого же и придуман?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include <initializer_list>
#include <array>
using namespace std;
template <typename T, size_t sz>
class cont {
    array<T, sz> data;
public:
    cont(initializer_list<T> args) :data(args) 
       {//std::array<T,5>::array(std::array<T,5> &&)": невозможно
// преобразовать аргумент 1 из "std::initializer_list<_Elem>" в "const std::array<T,5> &"
       }
 
};
int main()
{
    cont<char, 5> c = { 'a', 'b', 'c', 'd', 'e' };
    cin.get();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.07.2018, 20:52
Ответы с готовыми решениями:

почему не пашет? строки
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;fstream&gt; using namespace std; int main() { ifstream rin(&quot;rus.txt&quot;); if (!rin)...

почему прога не пашет?
/*Цель программы: Вычислить минимум F(x)=k*(a*x+b)*P(x) на отрезке с точностью eps P(x) - интерполяционный многочлен от f(x) ...

перегрузка постфикса ++ для работы с массивом (почему-то не пашет)
#include &lt;iostream.h&gt; class arr { public: arr(int number); ~arr(); void Vivod(); arr operator++ (int); private: int...

7
 Аватар для anapshy
533 / 274 / 220
Регистрация: 14.11.2016
Сообщений: 1,054
18.07.2018, 22:14
Лучший ответ Сообщение было отмечено Kuzia domovenok как решение

Решение

Эх... Если бы у std::array был конструктор поддерживающий такие операции... Мечта, да и только

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <array>
#include <initializer_list>
#include <algorithm>
 
template<typename _Ty, std::size_t _Sz>
class Container
{
private:
    std::array<_Ty, _Sz> mData;
public:
    Container(std::initializer_list<_Ty> args)
    {
        if (args.size() > _Sz)
        {
            throw /* бросаем исключение */;
        }
        else
        {
            std::size_t idx{};
            for (const _Ty &it : args)
            {
                mData[idx++] = it;
            }
            while (idx < _Sz)
            {
                mData[idx++] = _Ty{};
            }
        }
    }
    template<typename _Ty2, std::size_t _Sz2>
    friend std::ostream& operator<<(std::ostream &os, Container<_Ty2, _Sz2> &rhs)
    {
        for (const auto &it : rhs.mData)
        {
            os << it << ' ';
        }
        return os;
    }
};
 
int main()
{
    Container<int, 5> obj{ 1, 2, 3, 4 };
    std::cout << obj << std::endl;
}
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <array>
#include <utility>
 
template<typename _Ty, std::size_t _Sz>
class Container
{
private:
    std::array<_Ty, _Sz> mData;
public:
    template<typename ...Args>
    Container(Args&&... args)
        : mData{std::forward<Args>(args)...} {}
    template<typename _Ty2, std::size_t _Sz2>
    friend std::ostream& operator<<(std::ostream &os, Container<_Ty2, _Sz2> &rhs)
    {
        for (const auto &it : rhs.mData)
        {
            os << it << ' ';
        }
        return os;
    }
};
 
int main()
{
    Container<int, 5> obj{ 1, 2, 3, 4 };
    std::cout << obj << std::endl;
}
Добавлено через 1 минуту
"array - это агрегатный тип (не имеет конструкторов и закрытых/защищённых членов), что позволяет использовать агрегатные инициализаторы."
https://ru.cppreference.com/w/cpp/container/array

https://ru.cppreference.com/w/... ialization
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
18.07.2018, 23:13  [ТС]
Цитата Сообщение от anapshy Посмотреть сообщение
"array - это агрегатный тип (не имеет конструкторов и закрытых/защищённых членов), что позволяет использовать агрегатные инициализаторы."
а эта его агрегатность случаем ещё не означает, что он размещает свой буфер не отдельно в куче или наоборот вместе с объектом array?
Потому что понятно, что в программе
C++
1
2
3
4
5
6
7
int main(){
  std::vector<int> v(50);//локальная переменная на стеке хранит лишь несколько байт
// - голый указатель и служебную информацию size capacity блаблабла
//а 50 интов выделяются в куче
  std::array<int, 50> a;//а где этот массив выделяется?
  //...
 }
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.07.2018, 02:28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
что он размещает свой буфер не отдельно в куче или наоборот вместе с объектом array?
До С++14 расположение не определялось. С 14
The underlying array is a temporary array of type const T[N], in which each element is copy-initialized (except that narrowing conversions are invalid) from the corresponding element of the original initializer list. The lifetime of the underlying array is the same as any other temporary object, except that initializing an initializer_list object from the array extends the lifetime of the array exactly like binding a reference to a temporary (with the same exceptions, such as for initializing a non-static class member). The underlying array may be allocated in read-only memory.
т.е. всё скопировано в стек. Если объект временный, то только-для-чтения.

Добавлено через 9 минут
Касательно инициализации, то тут наверно будет ближе это - https://en.cppreference.com/w/... l/to_array

Добавлено через 1 час 1 минуту
Сделал по аналогии, вроде бы работает. Правда коряво получилось с передачей размера, но пока не знаю как сделать красивее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <initializer_list>
#include <utility>
#include <array>
using namespace std;
 
 
namespace detail {   
template <std::size_t N> class SizeSaver {};    
    
template <class T, std::size_t N, std::size_t... I>
constexpr std::array<T, N>
        to_array_impl(initializer_list<T> &a, const SizeSaver<N> &, std::index_sequence<I...>)
    {
        return { {*(std::begin(a)+I)...} };
    }
}
 
template <class T, std::size_t N>
constexpr std::array<T, N> to_array(initializer_list<T> &a)
{
    return detail::to_array_impl(a, detail::SizeSaver<N>(), std::make_index_sequence<N>{});
}
 
 
template <typename T, size_t sz>
class cont {
    array<T, sz> data;
public:
    cont(initializer_list<T> args) : data( to_array<T, sz>(args) ) {}
 
};
int main()
{
    cont<char, 5> c = { 'a', 'b', 'c', 'd', 'e' };
    cin.get();
    return 0;
}
Добавлено через 19 минут
вот только размер у initializer_list<T> - времени выполнения, поэтому statc_assert'ы не помогут помешать инициализации избыточным числом элементов.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
19.07.2018, 11:08
Кликните здесь для просмотра всего текста
Цитата Сообщение от TRam_ Посмотреть сообщение
До С++14 расположение не определялось. С 14
Только вопрос был про std::array, а не initializer_list.
0
19.07.2018, 13:22

Не по теме:

rat0r,

Кликните здесь для просмотра всего текста
не заметил, извиняюсь. В std::array действительно не указано где ему быть.

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
27.08.2018, 06:33
del
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
27.08.2018, 19:36
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а эта его агрегатность случаем ещё не означает, что он размещает свой буфер не отдельно в куче или наоборот вместе с объектом array?
Вся суть класса std::array как раз и заключается в том, что он содержит массив напрямую внутри себя и ни в коем случае не в куче. std::array является агрегатным типом, а это автоматически исключает возможность какой-то нетривиальной конструкции или деструкции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2018, 19:36
Помогаю со студенческими работами здесь

Проверьте почему не пашет
Плиз устраните причину проблемы а то не пашет =\ var a,b,c : integer; begin readln(a,b); for c:=a to b-1 do write(c,' '); ...

Воспроизведения аудио в медиаэлементе. Не пашет. Почему?
Очень прошу помочь новичку (работаю с Visual Express и самим языком совсем недавно)- не получается воспроизвести аудиофайл в интерфейсе...

KeyListener Почему то не пашет гляньте если не тяжело
System.out.println('11111111111');//Вот до этого места нормально combo.addKeyListener(new KeyAdapter(){ public void...

прогу написал, но что-то не пашет, или пашет неправильно посмотрите
В матрице удалить столбцы, в которых все числа меньше нуля. вот код uses crt; type mas=arrayof integer; var n,m,i,j:byte; a:...

Нашел в справочке к 6-му Делфи код но он не пашет, кто пояснит почему?
procedure TForm1.Button1Click(Sender: TObject); const InfoNum = 10; InfoStr: array of string = ('CompanyName',...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru