|
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
|
||||||
Инстанцирование и специализация шаблона21.08.2023, 07:51. Показов 4718. Ответов 40
Метки нет (Все метки)
Всем привет!
В чём различия инстанцирования от специализации при объявлении?
0
|
||||||
| 21.08.2023, 07:51 | |
|
Ответы с готовыми решениями:
40
Инстанцирование шаблона Инстанцирование шаблона
|
|
фрилансер
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
|
|
| 24.08.2023, 09:46 | |
|
IGPIGP, можно вот так взглянуть:
шаблон - это чертёж будущей сущности. специализация - это тоже чертёж, только с исправлениями (на данный момент в "физическом" коде ещё ничего не появилось, то есть шаблон никакого машинного кода не породит сам по себе) инстанцирование (явное или неявное) - это применение компилятором чертежа и создание "физической" сущности в коде
2
|
|
|
Комп_Оратор)
|
|
| 24.08.2023, 11:14 | |
|
Алексей1153, да - именно так я и думаю. У этих вещей (явное инстанцирование и явная специализация) разное назначение, но одна может использовать другую, а другая, - нет. То есть, в ваших терминах, инстанцирование использует наиболее актуальный чертёж, на момент своего осуществления)
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 24.08.2023, 16:57 | ||
|
Явная специализация и явное инстанцирование для одинаковых наборов параметров порождает один и тот же символ, то есть порождает определение для функции с одной и тот же сигнатурой. Это, разумеется, ошибочная, ситуация, т.е. обыкновенное "множественное определение" с точки зрения линкера. По этой причине, если во время компиляции явное инстанцирование "знает" о существовании явной специализации (то есть явная специализация расположена выше в единице трансляции), то явное инстанцирование ничего не делает. Здесь все логично: считаем, что явное инстанцирование просто ссылается на явную специализацию. Если же явное инстанцирование "не знает" о существовании явной специализации, то мы имеем очевидную проблему. А сумеет ли реализация диагностировать эту проблему - зависит от качества реализации. Я бы ожидал, что "обратное" расположение явного инстанцирования и явной специализации в одной единице трансляции (как в примере ТС) будет отлавливаться всеми уважающими себя реализациями. И это так. А явное инстанцирование и явная специализация, разбросанные по разным единицам трансляции, будут отлавливаться уже линкером - как множественные определения. И это так. Но по-видимому тут есть еще какие-то нюансы, вследствие которых стандарт говорит, что диагностика не требуется. Все просто и понятно сразу. Ничего тут не надо искать.
0
|
||
|
Комп_Оратор)
|
||
| 24.08.2023, 17:11 | ||
|
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||
| 24.08.2023, 17:56 | ||||
|
Постарайтесь заучить простое правило, которое я здесь уже не раз приводил (но почему-то оно все никак не прививается): когда в шаблоне (функции, класса и т.п.) больше не осталось свободных шаблонных параметров, то шаблон перестает быть шаблоном и превращается в обычную классическую сущность (функцию, класс и т.п.). В частности, эта сущность перестает вести себя как шаблон и начинает вести себя как обычная сущность в отношении ODR. (Где, кто и когда "порождает код" - это, конечно, детали реализации, но традиционные реализации ведут себя именно так и стандарт языка написан в расчёте именно на такие реализации.) --- Что же касается остального, то это было: 1. разбор вашего вообще никак не относящегося к теме вброса про некое "разбухание" кода, 2. общее непонимание некоторыми участниками дискуссии того, что такое явная специализация и явное инстанцирование. Я думаю, что я все достаточно подробно все разобрал и объяснил в своих сообщениях выше.
1
|
||||
|
Комп_Оратор)
|
||||||
| 24.08.2023, 19:04 | ||||||
|
https://www.open-std.org/JTC1/... /n3797.pdf
- как явное инстанцирование, так и объявление явной специализации не должны появляться в программы, если только явное создание экземпляра не следует за объявлением явной специализации. Реализация не требуется для диагностики нарушения этого правила. То есть, стандарт выделяет случай когда явное создание экземпляра следует за объявлением явной специализации Кроме того. Стандарт трактует явную специализацию как объявление. Инстанцирование может произойти позже - при вызове в коде.
Впрочем, об этом своими словами я уже писал. Это моя последняя попытка что-то объяснить. Добавлено через 19 минут в параграфе § 14.7.2 на который ссылается первая цитата
И кстати. Стандарт разделяет определение и декларацию явного инстанцирования. И декларацией считается выражение предваряемое ключевым словом extern. То есть, это вещи похожие и очень близки но разные. Разные. Добавлено через 3 минуты вот тут об этом (см. в самом низу цитаты:
0
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|||||||
| 24.08.2023, 20:33 | |||||||
|
Что же касается "инстанцирования": нет, никакого "инстанцирования явной специализации" произойти не может. Понятие "инстанцирования" к явной специализации неприменимо. Почему это происходит я уже подробно объяснил в предыдущих сообщениях, и для закрепления повторил здесь: понятие "инстанцирования" к явной специализации неприменимо.
0
|
|||||||
|
Комп_Оратор)
|
|||
| 24.08.2023, 21:10 | |||
|
TheCalligrapher, не нужно меня поучать запомнить, что-то. Это не подействует.
0
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 24.08.2023, 21:14 | ||
|
--- Желающим разбираться в таких вопросах сразу скажу: все это вытекает из и опирается на классический принцип раздельной компиляции, на котором исторически базируются все реализации С и С++. Все, что вы читаете в стандарте на тему ODR, на тему явного и неявного инстанцирования шаблонов, на тему явной специализации и т.д. и т.п. будет всегда опираться на соображения, ориентированные на поддержку классического принципа раздельной компиляции. Если вы разберетесь, как на практике работает раздельная компиляция в С++ (особенно с шаблонами), вам в большинстве не нужно будет заглядывать в стандарт языка для того, чтобы найти описания интересующего вас поведения. То, что я объяснял выше, вам будет сразу интуитивно понятно само собой, самоочевидно. Ничего сложного в том, как организована раздельная компиляция в С++ нет, но ее понимание сразу позволит вам самостоятельно "дедуцировать" и/или понять огромные куски спецификации языка. Если же вы не понимаете и не хотите понимать, как работает раздельная компиляция в С++, то попытки читать стандарт на рассматриваемую тему лишь завалят вас нагромождениями абстрактной информации, которая при этом перемешается с вашей и чужой отсебятиной. Что мы, в частности, и наблюдаем в данном случае.
0
|
||
|
Комп_Оратор)
|
|||||
| 25.08.2023, 00:19 | |||||
|
Вы писали:
я спросил по русски:
0
|
|||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|||
| 25.08.2023, 00:42 | |||
|
http://eel.is/c++draft/temp.explicit#7
0
|
|||
|
Комп_Оратор)
|
|||||
| 25.08.2023, 02:38 | |||||
|
Я подозреваю, что нет в стандарте утверждения о том, что явное инстанцирование после явной специализации "ничего не делает", хотя допустимо синтаксически (или как-то так). И вам показать нечего. Нет ссылки и вы ведёте себя... Ну неожиданно, скажем. Я видел вас в разных ситуациях, но не в такой.
0
|
|||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||
| 25.08.2023, 02:47 | ||
¯\_(ツ)_/¯ Остаётся лишь, в который уж раз, заметить - тут все понятно... —- Я достаточно подробно раскрыл тему и, надеюсь, посторонний шум не помешал остальным участникам обсуждения подчеркнуть для себя что-то новое в ее понимании. Я думаю, все здесь уже научились этот шум игнорировать. Если дальнейших вопросов нет, будем считать обсуждение закрытым.
0
|
||
|
Комп_Оратор)
|
|||||||||||||||||||||
| 25.08.2023, 15:52 | |||||||||||||||||||||
|
https://www.cyberforum.ru/post17014687.html потом был https://www.cyberforum.ru/post17014693.html без ответа на вопрос А пост https://www.cyberforum.ru/post17014811.html был размещён в два приёма. Причём первая часть противоречит второй. Она провоцирующая и спровоцировала мой ответ. Вот так это выглядело вначале: Сегодня прочитав тот пост полностью в том виде как он есть сейчас я уже увидел ответ и ссылку и цитату. Бог с ним. Могу лишь отметить., что в стандарте написано если не противоречиво, то двусмысленно. Мой небольшой эксперимент показал, что объявление явного инстанцирования (extern), может ссылаться как на определение явного инстанцирования, так и на объявление явной специализации. Получается, что объявление явной специализации включает определение явного инстанцирования и при последовательном размещении поглощает его. Поэтому, явное инстанцирование после явной специализации остаётся не у дел. Это можно было бы изложить по-человечески придерживаясь иерархии понятий. Однако в стандарте это сделано в виде декларативной юридической нормы. Хороший кусок хлеба для зубрил на память. Вот файлики которые могут продемонстрировать сказанное: один заголовочник
0
|
|||||||||||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||||||||||||||||
| 25.08.2023, 16:30 | ||||||||||||||||||
|
Либо явное инстанцирование строго следует за явной специализацией в каждой единице трансляции, в которых они присутствуют (к каковом случае явное инстанцирование "ничего не делает"), либо программа ошибочна (диагностика не требуется). Если реализация не выдала диагностики в последнем случае, то поведение программы не определено. Единственная польза от этой программы - спрятавшаяся в комментарии еще одна искорка понимания: И здесь понемногу наблюдается какой-то прогресс... Хотя дальше снова пошел поток отсебятины:
0
|
||||||||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||
| 25.08.2023, 17:24 | ||||
|
https://timsong-cpp.github.io/... eneral-5.3
0
|
||||
|
Комп_Оратор)
|
||
| 25.08.2023, 18:38 | ||
|
во-первых именно это у меня и есть:
То место в стандарте где указано что инстанцирование происходит после обхявления явной специализации либо неявно либо явно становится совсем мутным, правда. Ведь выходит, что оно происходит прям там и сразу... Я работал с тех.стандартами и видел много плохого. Но стандарт С++ это что-то.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|||||||
| 25.08.2023, 21:03 | |||||||
|
Процитированный мною участок стандарта нигде не требует именно explicit instantiation definition для применения этого правила. Там сказано просто explicit instantiation и все. То есть наличие любой формы explicit instantiation активирует это правило. Стандарт в этом отношении очень педантичен. Если бы речь шла именно о explicit instantiation definition, так бы сказано и было, как, например, в первой части этого же правила. Он иллюстрирует только то, о чем я уже говорил выше: внутреннее имя линкерного символа для функции, полученной через явную специализацию, "случайно" совпадает с внутренним линкерным именем для функции, полученным через явное инстанцирование. Благодаря этому совпадению, можно обмануть реализацию: в одном файле пообещать ей явное инстанцирование, а в другом подсунуть ей взамен явную специализацию. И линкер тупо не заметит обмана. Именно такой обман вы и выполнили в своем примере. И именно по этой причине такие ошибки стандарт заносит в категорию "диагностика не требуется". Простого способа заткнуть эту дыру не существует, то есть недопущение таких ошибок в вашем коде - ваша обязанность. И, разумеется, не надо пытаться специально обмануть компилятор. Добавлено через 22 минуты --- Более того, даже если мы полностью вычеркнем из стандарта то правило, которое я процитировал выше, ваш код все равно будет ошибочным по другим правилам стандарта языка: * Если в точке вызова some_template_fn(123); вы намеревались воспользоваться явным инстанцированием, то вы нарушили требованияhttps://timsong-cpp.github.io/... xplicit#13
* Если же в точке вызова some_template_fn(123); вы намеревались воспользоваться явной специализацией, то вы нарушили требованияhttps://timsong-cpp.github.io/... xpl.spec#7
0
|
|||||||
|
Комп_Оратор)
|
|
| 25.08.2023, 21:29 | |
|
Тогда снова получается противоречие. То есть, если раскомментировать explicit instantiation definition, то будет выполнено требование 13 [...]. И если это требуется, то нельзя сказать, что explicit instantiation definition has no effect. Если звёзды зажигают, значит у звёзд есть на что зажигать...
То есть, моей целью и было - показать, что объявления специализации без последующего явного инстанцирования недостаточно, чтобы external definition позволил это слинковать. Но он позволил и я решил, что таки да - has no effect потому как выходит что объявление явной специализации само по себе, содержит в себе инстанциирование. Теперь выходит, что и это не верно согласно букве стандарта. Тогда опять я был прав: опред-е яв.инст-я после яв. полн. спец-ии имеет право на жизнь, потому, что это иной раз просто необходимо. Как в моих файликах. И поэтому стандарт специально оговаривает этот случай.
0
|
|
| 25.08.2023, 21:29 | |
|
Инстанцирование шаблона для различных типов специализация шаблона Специализация шаблона специализация шаблона
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|