|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
||||||
Головоломка для тех, кому под Новый Год нечего делать28.12.2023, 09:07. Показов 5608. Ответов 34
Метки нет (Все метки)
Тема на самом деле уже не раз упоминалась, но тем не менее... Пример кода
p).Головоломка: кто прав согласно спецификации языка?
0
|
||||||
| 28.12.2023, 09:07 | |
|
Ответы с готовыми решениями:
34
Кому скучно и нечего делать, у меня есть нерабочий код Если кому-то нечего делать по выходным в ближайшие полтора года Крестики-нолики. Кому делать нечего научите как исправить ошибку |
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
||||
| 29.12.2023, 22:24 [ТС] | ||||
|
При чем здесь значения полей? Значения полей живут своей жизнью, никак не связанной с самими полями. Почему это мы "не имеем права" их возвращать? Если вы хотели сказать, что деструкция объекта-параметра может инвалидировать и значение поля... то я по-прежнему не понимаю, что вы хотите сказать. Деструкция объекта-параметра была и есть всегда. Мой ответ на самом деле лишь продлевает время жизни объекта-параметра. Как из этого можно было сделать вывод, что продление времени жизни приводит к "не имеем права возвращать"??? В упор не понимаю. А вот это утверждение из #14 p проводилось некое прямое копирование данных именно и непосредственно из поля s.r. Функция foo возвращает prvalue. Никакой привязки именно к полю s.r у возвращаемого prvalue нет. Нас интересует только значение этого поля. Но язык не обязан брать его из этого поля в некий "последний момент, непосредственно перед присваиванием в p".
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 29.12.2023, 23:21 | ||
|
0
|
||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
||
| 29.12.2023, 23:50 [ТС] | ||
foo является prvalue. Ни от каких продлений и ни от каких lifetime оно ни в коем случае не зависит. Зависимость от lifetime появилась бы, если бы foo возвращала void *&. Но она возвращает void *. Это всегда абсолютно безопасно.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 30.12.2023, 07:15 | ||
|
Когда мы пишем p = foo(p);, хотелось бы иметь возможность полагаться на конкретное значение p подобно тому, как мы уверены что int result = sum(2, 2); будет равно 4, а не 200 или 4 в зависимости от компилятора.
0
|
||
|
38 / 27 / 13
Регистрация: 18.12.2023
Сообщений: 74
|
|
| 30.12.2023, 09:40 | |
|
Решил почитать ISO/IEC 14882 2020 Года, если я правильно понял, то поведение GCC и Clang соответствует стандарту C++, где указатель p должен быть сброшен в nullptr после завершения вызова foo, но до присваивания результата функции переменной p.
Ссылаюсь на пункты class.temporary про описание жизненых циклов временных переменных basic.life - общее описание жизненного цикла объектов, от начала жизни до вызова его деструктора class.copy.elision - о создании или уничтожении объектов при передаче значений функции и возврате из них N4860.pdf
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
|||||||||||||
| 30.12.2023, 22:45 [ТС] | |||||||||||||
|
Поведение GCC/Clang нарушает этот стандарт. Однако это поведение (являющееся во многих отношениях более логичным и практичным) было, наконец, канонизировано в С++17. Именно по этой причине в данном вопросе все компиляторы правы (начиная с С++17). Обратите внимание, что стандарт четко квантифицирует два варианта допустимого поведения: либо параметры удаляются сразу повел завершения вызова функции, либо живут до завершения полного выражения. Удалять параметры "где по посередине" между этими моментами не разрешается. --- Интересно, кстати, заметить, что это означает, что в компиляторах, придерживающихся Itanium ABI, то есть откладывающих момент деструкции параметров, из функции можно (!) возвращать ссылки/указатели на их параметры, помня при этом, что эти ссылки/указатели далее в вызывающем коде можно использовать не позднее конца полного выражения. Разумеется, ничего хорошего в такой практике нет по целому ряду причин, но компиляторы, выбравшие такой implementation-defined вариант, обязаны гарантировать работоспособность такого кода. При этом GCC, какое-то время назад начавший крестовый поход против возвращения ссылок/указателей на локальные переменные (и взамен подставляющий нулевые ссылки/указатели!), умудряется выдать предупреждение на такое возвращение и также возвращает взамен нулевую ссылку/указатель. То есть компилятор GCC до легализации поздней деструкции параметров нарушал стандарт языка, а сейчас, добившись легализации поздней деструкции, по-прежнему реализует ее некорректно , т.е. опять нарушает стандарт языка, но по-другому ¯\_(ツ)_/¯ Например, вот такой код является совершенно корректным (и обладает полностью определенным поведением) в компиляторах, придерживающихся поздней деструкции параметров
Подавить и предупреждение, и возвращение нулевой ссылки, однако, несложно
0
|
|||||||||||||
|
Нарушитель
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
|
||
| 30.12.2023, 22:47 | ||
|
0
|
||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
||
| 30.12.2023, 22:55 [ТС] | ||
|
Я еще могу понять необходимость такого уточнения сейчас при обсуждении чего-то специфичного для С++23. Но для С++17... !!!
0
|
||
| 30.12.2023, 23:01 [ТС] | |
|
0
|
|
|
Комп_Оратор)
|
|||||||||||||||||||||
| 04.01.2024, 12:20 | |||||||||||||||||||||
|
Я пишу в этой теме без особой радости ввиду того, что моё отношение к ТС достаточно негативно. Не вдаваясь в подробности, я должен сказать, что причиной является выступление ТС в негативном комментарии к моему посту Объясните пожалуйста что делает конструкция *& в нашей функции и предоставленная ссылка сюда. Теперь о текущей теме. Моё мнение близко ко мнению Undisputed. Аргументы следующие. Вот функция:
0
|
|||||||||||||||||||||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
||
| 04.01.2024, 21:13 [ТС] | ||
|
В качестве резюме лишь компактно реитерирую уже сказанное выше: целью этой темы являются иллюстрация того малопонятного новичкам факта, что параметры функции НЕ являются локальными объектами этой функции. Параметры функции принадлежат вызывающему коду. А также иллюстрация того факта, что если ранее эти свойства параметров существенной роли не играли (кроме, разве что, вопросов обработки исключений), то начиная с С++17 они начинают иметь существенно более заметные и далеко идущие последствия. Приведенный искусственный пример как раз и иллюстрирует один из вариантов таких последствий. Пока у вас не возникнет понимания этого вопроса, то есть пока вы будете упёрто расценивать параметры функций как ее "локальные объекты", вам рано или поздно придется столкнуться с неожиданными ситуациями, не вписывающимися в круг ваших заблуждений. И тут вам придется либо заставить себя разобраться в теме, либо... "без особой радости" продолжать выдумывать "свои мнения" и притягивать за уши теории о "некорректности работы компиляторов" в отчаянных попытках натянуть сову своих домыслов на глобус реальности.
0
|
||
|
Комп_Оратор)
|
||
| 04.01.2024, 22:17 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 05.01.2024, 14:48 | ||||||
|
IGPIGP,
На самом деле возврат поля это лишь частный случай проблемы. Приведу пример утечки памяти, которую на уровне языка не получится отследить. Представим что функция foo выглядит вот так
p = foo(p);, то язык нам не говорит, будет ли в итоге утечка памяти или нет. Если разрушение объекта s будет перед присваиванием, то мы получим адрес и сможем освободить соответствующий участок памяти. Если же объект s будет разрушен после присваивания, то мы получим утечку без возможности освободить выделенную память. Более того, если функция что-то считает и записывает результат в динамически выделенную память, то все эти расчеты благополочно вылетят в трубу.Добавлено через 3 минуты Основная претензия здесь в том, что это implementation defined, что на мой взгляд некорректно. Думаю, здесь должна быть конкретика, а желающие какую нибудь экзотику компилятописатели, могут сделать фичу в своем компиляторе и включать ее через флаг
0
|
||||||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
|
|||
| 05.01.2024, 19:23 [ТС] | |||
|
0
|
|||
| 05.01.2024, 19:23 | |
|
Ищу консультанта/учителя С под Linux, Для тех,кому интересно делиться знаниями Написал программу от делать нечего, она оказалась полезной. А дальше что с ней делать?
Для тех, кому непонятна рекурсия Тест-игра (для тех, кому за 18) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|