|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
Можно ли Конструктор и Деструктор вызывать как метод класса?29.06.2019, 12:03. Показов 21140. Ответов 222
Метки нет (Все метки)
Собственно вопрос:
можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса? Например, я хочу управлять очередностью вызовов. См. пример:
0
|
||||||
| 29.06.2019, 12:03 | |
|
Ответы с готовыми решениями:
222
Как правильно вызывать конструктор шаблонного класса? Можно ли явным образом вызывать деструктор? Конструктор и деструктор анонимного класса |
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 07.07.2019, 18:42 | ||||
|
Это же приведет к противоречию в стандарте... потому что: иначе стандарт противоречил бы сам себе позволяя читать актуальные данные из const поля в обход оптимизации (применяя std::launder) потому что смысла бы в таком чтении бы не было т.к уже настало UB, еще до std::launder, там где placement new... тогда дальше ничего нельзя было бы гарантировать. Но как мы видим, гарантии все же есть, и такие поля можно читать но думаю это все же не проблема исходящая из стандарта а проблема несоответствующей стандарту реализации и головная боль пользователей этой реализации
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||
| 08.07.2019, 00:41 | |||||||||||||||
|
где описывается в каких случаях можно реюзать объект. и сам же выше писал: логично предположить, что во всех остальных случаях это UB. и вроде как, мы уже разобрались почему нельзя реюзать классы, которые содержит константно/ссылочные поля. что это это связанно с тем, что нельзя модифицировать объект, рожденный константным.
стандарт не противоречит сам себе, когда объявляет, что модификация константного объекта - это UB. а затем, позволяет легально читать актуальные данные из const поля в обход оптимизации (применяя std::launder) ? это такой костыль, навроде volatile, который позволяет дотянуться до данных подвинув оптимизатор в сторонку. там есть занимательный экземпел:
перевожу на простой русский: "указатель P - это не то, что вы подумали. он не указывает на объект, как обычно указывают все прилично воспитанные указатели в цивилизованных программах. нет. в условиях UB, такой указатель - шашка с динамитом, и фитиль уже горит. ещё чуть чуть и будет больно. но есть лайф-хак. пока этот говнокод ещё не крашнулся, через указатель можно дотянуться до данных" скажем так: используя std::launder, можно прочитать константное поле. если конечно процесс ещё раньше где нибудь не крашнулся (на этапе new placement, например) а вот как класс в целом будет работать: например, что вернёт return this->const_field; - вопрос остается открытым.Добавлено через 2 минуты
0
|
|||||||||||||||
|
Комп_Оратор)
|
||||||
| 08.07.2019, 09:33 | ||||||
|
hoggy, что касается констант и ссылок то причины порождающие неоднозначность более-менее ясны. Однако если пользователь обеспечивает реинициализацию тем же значением для констант времени выполнения и даже тем же адресом для констант со статическим классом хранения, разве это может стать причиной проблем?
И отдельный вопрос как ветка темы. Не вдаваясь в современные Тогда кроме типа (в старом понимании - формат, операции, размер) в данное определение стучатся нестатические данные со статическим классом хранения. Например вот такой указатель инициализированный вот так:
То есть, беда в том, что если в старое понятие типа добавить, то что указано в старте вопроса: Пусть семантикой типа считается вся информация об объекте не связанная с его состоянием. Тогда, это учитывает такие неизменяемые данные как константы статического класса хранения но не статического способа владения (то есть полей объекта). Проблема в том, что язык не выражает такое различие в типах явно. Он даже не явно этого не выражает. С точки зрения языка ns1 и ns2 принадлежат одному типу. Я думаю, данное внутреннее противоречие неразрешимо на сегодняшний день и это возможная причина по которой стройное и точное определение заменено жидким рассказом. Но разрежение определение всегда ведёт к разжижению мозгов. Неудивительно, что у него достаточно много защитников. зы я не против порядка вообще и стандарта, в частности. Просто, интересно порассуждать о логике и фактах. Они упрямы (как гласит мудрость) и не укладываются в плохие термины, определения.
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||||||||||||
| 08.07.2019, 12:34 | |||||||||||||||||
|
потому что это нарушало бы гарантии стандарта (это в случае если используется std::launder) если в коде выше написано что
![]() другое дело как сильно будет болеть голова у тех кто будет отслеживать подобное что бы обеспечить эти гарантии
то есть это рабочий указатель на байтики с обновленными данными this->const_field это ничто иное как часть нового объекта а раз у нас есть рабочий указатель на обновленные байтики то полагаю что return this->const_field должен вернуть то, что в его область памяти было записано последним то есть думаю исходя из этого можно сделать вывод
0
|
|||||||||||||||||
|
Комп_Оратор)
|
|||||||
| 08.07.2019, 14:11 | |||||||
А в методах объекта (там где this) такая опасность не должна присутствовать. Иначе нужно допустить, что для разных объектов компилятор может заинлайнить разный код (ведь константы времени выполнения у разных объектов могут отличаться).
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 08.07.2019, 14:27 | |
|
IGPIGP,
Пусть инлайнит, какие проблемы если это допустить?) Добавлено через 1 минуту Там где будет launder, гарантии же есть
0
|
|
|
Комп_Оратор)
|
|||
| 08.07.2019, 19:28 | |||
![]() Добавлено через 3 часа 49 минут Я не уверен, но сомневаюсь, что методы класса могут встраиваться по разному в зависимости от значения полей констант времени компиляции. Я пытался сказать, что для ситуаций с внутренним скоупом объекта класса не должно быть проблем, где launder нужен. Но буду признателен, если кто-то покажет такой случай.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 08.07.2019, 20:02 | |
|
IGPIGP,
Насколько я понял вам интересно нужно ли применять launder к полям внутри методов? Если вопрос был в этом то помоему не нужно. Он будет нужен при использовании указателя (надо будет прогнать через него указатель) от имени которого вызывается метод
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||
| 08.07.2019, 21:05 | |||||||||||||
|
которые декларирует как UB. и при чем тут std::launder? у тебя процесс может крякнуться задолго до момента его использования. значит не факт, что эта строчка кода вообще выполнится. лютый говнокод в терминальной стадии. тебе никто не обещает, что ты сможешь дотянуться до данных, если не используешь std::launder. учитывая что оригинальная строка была:
это - UB. костыльный std::launder заставляет компилятор честно заново вычитывать память. (не использовать оптимизирующие кэши, и тп штуки). это может сработать при условии, что процесс не крякнулся ещё на этапе перезаписи константного объекта. однако, любой код, который не использует std::launder никому ничего не гарантирует. UB никуда не делось. Добавлено через 7 минут если конечно не считать того, что программко упадет (в лучшем случае) или будет работать не правильно. Добавлено через 1 минуту а вот сама попытка перезаписи константного объекта - очень даже может быть. access violation, например.
0
|
|||||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 08.07.2019, 21:26 | ||
|
то что я утверждаю касается только того случая где есть std::launder естественно const объекты модифицировать запрещено и это UB мы вроде уже обсудили это почти в самом начале беседы
0
|
||
|
Комп_Оратор)
|
||
| 08.07.2019, 21:33 | ||
|
А вот поля - константы времени компиляции я себе (без злого умысла того кто это вершит) не представляю. Статические константы - да. но это данные класса. А константы - поля объекта, - не представляю (именно константы времени компиляции в реализации).
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 08.07.2019, 22:16 | |||||||
|
потому что нет никаких гарантий. потому что UB никуда не делось. UB начинается в момент работы new placement потому что: а значит до строчки: или дойти, но как то не так. и в этом нет вины компиляторов. в условиях UB компиляторы ничего не гарантируют. ----------------------- а вот std::launder привносит некоторое противоречие в спецификацию. он обещает суметь вычитать константное значение правильно, даже если была осуществлена попытка его изменения. что-то вроде: "если ваш процесс все ж таки дожил до использования std::launder, тогда через std::launder вы сможете правильно прочитать значение измененной константы" на самом деле, строго говоря, это так же не гарантируется. результат работы std::launder - указатель, для которого были отброшены все оптимизации, связанные с оригинальным указателем. и только лишь. но поскольку UB никуда не девалось, уже в принципе никто никому ничего не гарантирует. зы: лично я вообще не понимаю, для каких сакральных нужд этот костыль завезли в стандарт. Добавлено через 7 минут теоретически, компилятор запросто может расположить любую константу в read-only.
1
|
|||||||
|
Комп_Оратор)
|
||
| 08.07.2019, 22:48 | ||
|
Ну допустим в военных системах для врагов (на экспорт) это и целесообразно. Если это так то это и есть аргумент. Но это и значит, что константа - поле класса не является параметром состояния. Статическим членом класса она тоже не является. Просто какая-то Не люблю, когда математики пытаются писать определения для прикладных вещей.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 08.07.2019, 23:09 | |||
|
hoggy,
вот теперь я понял в каком месте мы друг друга не понимаем )) перефразирую: да, то о чем ты говоришь это проблема которую должна разрулить реализация что бы не было UB, например реализация может: если где-то есть модифицированный const, который читается через std::launder 1) отследить такой вызов и если он есть то генерировать код, который не приведет к access violation. 2) не делать константы read only на уровне памяти и никаких access violation не будет. некоторые из них используют вложенные классы для реализации узлов поля этих узлов можно делать константными ведь так? но как мы знаем память внутри контейнеров как правило переиспользуется т.е в одном участке время от времени могут сидеть разные ноды с константными полями значения которых так же может быть разным и вот что бы их как то гарантировано прочитать можно эту фичу и задействовать что касается записи в эти поля - то как уже говорил выше, отсутствие access violation должна обеспечить реализация ибо в стандарте четко написано что это рабочий код а не как ты говоришь "если не свалится на placement new то только в этом случае". таких оговорок в топике про std::launder просто нет
0
|
|||
| 09.07.2019, 10:25 | |
|
Не по теме: Опять hoggy нашёл "противоречие в стандарте" там, где его нет :D
0
|
|
| 09.07.2019, 10:37 | |
|
Не по теме: rat0r, Вы разглядели в нем талант?
0
|
|
| 09.07.2019, 10:39 | |
|
Не по теме: Croessmah, давно
0
|
|
| 09.07.2019, 10:43 | |
|
Не по теме: rat0r, значит нужно развивать. Не мешайте. :D
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||
| 09.07.2019, 11:33 | |||||||||
|
правил языка это не нарушает. в чем сакральный смысл самого понятия "UB" ? предполагается, что компиляторов может быть множество. и не важно, как именно, они будут реализовывать ту, или иную фичу. стандарт описывает гарантии: как делать правильно. во всех остальных кейсах - поведение не определенно. стандарт запрещает модифицировать константу. не важно почему: один компилятор может запихать данные в read-only, другой компилятор сделать inline-подстановку, третий - ещё что нибудь, и всё вышеперечисленное вместе. суть одна: ты не можешь закладываться, что априори сама модификация константы пройдет успешно. и не можешь закладываться, что после модификации константы работа будет корректной. не можешь закладываться даже если после такой модификации, ты использовал std::launder, потому что не можешь знать, что и где ещё могло поломаться после такого грубого нарушения правил игры. ситуация, когда никто не даёт никаких гарантий и есть "UB". Добавлено через 16 минут и оно никуда не делось. std::launder ты используешь уже в условиях UB. что бы сбросить все эффекты возможных оптимизаций с указателя. это может сработать. но UB от этого не перестает быть UB. даже интересно: как ты эти два пункта реализуешь? а может просто не писать говнокод, который приводит к UB? но потом в принципе нельзя будет делать new placement. пример не годится. ты не сможешь привести ни одного корректного примера, потому что область применения std::launder - в некорректном коде. он применяется, когда UB. где там написано, что это - рабочий код? там написано, что std::launder сможет дотянуться до измененного константного значения. и это все, что там написано. undefined behaviour называется. вот ты сам понимаешь, насколько тупо ты сам себе сейчас противоречишь?
0
|
|||||||||
| 09.07.2019, 11:33 | |
|
Зачем нужны конструктор и деструктор класса? Дописать конструктор и деструктор для класса Для класса задать конструктор и деструктор Конструктор (деструктор) у класса, не имеющего тип Создание класса с перегрузкой операторов конструктор и деструктор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|