Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Затираются значения при возврате из функции initializer_list

12.08.2016, 14:14. Показов 1198. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дарова.
Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
initializer_list<int> fun()
{
    int a(1), b(2);
    return
    {
        a, b
    };
}
 
void main()
{
    auto&& x(fun());
    for (const auto& i : x)
        cout << i << endl;
    system("pause");
}
update:
поковырявшишь отладчиком, я заметил, что как раз таки после вызова fun значения не трутся, а вот когда начинается цикл, то значения листа превращаются в какую та кашу
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2016, 14:14
Ответы с готовыми решениями:

Вызов функции в возврате значения функции
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

конструктор при возврате значения из ф-ии
В литературе написано что при возврате значения из ф-ии вызывается конструктор копирования, но в примере такого не происходит. Сначала...

Особенности использования указателей и ссылок в C++ при возврате из функции
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

17
2393 / 1920 / 763
Регистрация: 27.07.2012
Сообщений: 5,560
12.08.2016, 14:39
А если так?
C++
1
2
3
    for (const auto& i : fun())
        cout << i << endl;
    system("pause");
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.08.2016, 14:41
Ferrari F1, Copying a std::initializer_list does not copy the underlying objects : http://en.cppreference.com/w/c... lizer_list

Добавлено через 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
struct Test {
    std::string s = "Hello";
 
    Test() = default;
    Test(Test const&)                { puts(__PRETTY_FUNCTION__); }
    Test(Test &&)                    { puts(__PRETTY_FUNCTION__); }
    Test & operator =(Test const&)   { puts(__PRETTY_FUNCTION__); return *this;}
    Test & operator =(Test &&)       { puts(__PRETTY_FUNCTION__); return *this;}
    ~Test()                          { puts(__PRETTY_FUNCTION__); }
};
 
std::initializer_list<Test> fun()
{
    Test t1, t2;
    return {t1, t2};
}
 
int main()
{
    auto x(fun());
    //for (const auto& i : x)
        //std::cout << i.s << std::endl; // UB
}
C++
1
2
3
4
5
6
Test::Test(const Test&)
Test::Test(const Test&)
Test::~Test()
Test::~Test()
Test::~Test()
Test::~Test()
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 14:45  [ТС]
John Prick, аналогично, но первое значение листа в цикле выводится верно, остальное - мусор.
Добавлено через 1 минуту
Цитата Сообщение от notAll Посмотреть сообщение
Copying a std::initializer_list does not copy the underlying objects
Ну да, я читал, что содержимое листа при копировании используется совместно.

Добавлено через 1 минуту
notAll, можешь объяснить почему цикл содержит НП? Ведь в main() лист попал в нормальном состоянии.
По крайней мере, все значения листа сохранены на момент перет циклом.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.08.2016, 14:47
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
можешь объяснить почему цикл содержит НП?
Объекты удалены. Доступ к ним UB.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
12.08.2016, 14:48
Неужели возвращаем из функции локальные объекты созданные на стеке с автоматической областью видимости?

PS не успел написать, опередили А мне DrOffset как раз недавно на это глаза открывал...
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 14:49  [ТС]
_Ivana, лист инициализируется копией a и b.
a и b удаляются в функции, а в листе они остаются, а сам лист же копируется
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
12.08.2016, 14:51
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
лист инициализируется копией a и b
Ничоси. А я думал - простыми ссылками.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 14:51  [ТС]
notAll, т.е. это опять компилятор виноват, что лист по возвращении из функции содержит вроде бы правильные значения?
_Ivana,
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 14:58  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
Ничоси. А я думал - простыми ссылками.
вы это серьезно написали или с сарказмом? Т.е. вы правда не знали, что копиями инициализируется?
Просто вот что пишет липпман
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
12.08.2016, 15:01
Ferrari F1, а почему не должно?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 15:04  [ТС]
notAll, т.е. в
C++
1
2
3
4
5
6
7
8
initializer_list<int> fun()
{
    int a(1), b(2);
    return
    {
        a, b // ВОТ ЭТИМ ЛИСТОМ ИНИЦИАЛИЗИРУЕТСЯ ВОЗВР. ЗНАЧЕНИЕ
    }; // ЭТОТ ЖЕ ЛИСТ ПО ЗАВЕРШЕНИИ ФУНКЦИИ УДАЛЯЕТСЯ И ВМЕСТЕ С НИМ И ЕГО СОДЕРЖИМОЕ???
}
причина правильно мною описана?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 15:05  [ТС]
HelicopterK52, весь агонь в этай теме
Затираются значения при возврате из функции initializer_list
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
12.08.2016, 15:19
Ferrari F1, А какую книгу читаете?
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.08.2016, 15:20
Ferrari F1, не знаю, что может быть не понятно. Элементы std::initializer_list не копируются. Вот еще и цитата из стандарта:
An object of type initializer_list<E> provides access to an array of objects of type const E. [ Note:
A pair of pointers or a pointer plus a length would be obvious representations for initializer_list.
initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does
not copy the underlying elements. — end note ]
. Следовательно, когда std::initializer_list покидает свою область видимости, то его объекты уничтожаются.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
12.08.2016, 15:22
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вы это серьезно написали
Серьезно. Я думал, все элементы всех полиморфных контейнеров инициализируются ссылками.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
12.08.2016, 15:25
http://stackoverflow.com/quest... turn-value
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
12.08.2016, 16:10  [ТС]
notAll, понятно, думал у этих листов поведение как у объектов захваченных шаред птром

Добавлено через 2 минуты
т.е. вместо листа лучше возвращать вектор?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.08.2016, 16:10
Помогаю со студенческими работами здесь

Как избежать копирования вектора, при возврате его из функции?
Вопрос простой. В классе есть поле вектор, член - данные. Методом я возвращаю его const std::vector&lt; unsigned char &gt;&amp;...

Применение std::move к локальной переменной при возврате из функции
Response HostHandler::notFound() const { Response resp; resp.status = 404; return std::move(resp); } Имеет ли это...

Почему не вызывается конструктор копирования при возврате объекта из функции
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Access violation writing location 0x0000001C при возврате вектора из функции
При возврате вектора из этой функции выкидывает исключение Exception thrown at 0x00E78AC8 in test.exe: 0xC0000005: Access violation...

Почему после выполнения команды cprintf значения строк затираются?
Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например,...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru