![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
вот решил понять получше, что есть указатели на функции
в связи с этим несколько вопросов появилось (скорее всего детских): пусть есть:
1. Наивный вопрос, но хочется уточнить. НИКАК нельзя в стандартном C++ сделать прямую зависимость между типом Func и func, как функцией этого типа? 2. что представляет собой выражение *func? 3. почему нет разницы между func и &func? Или есть? 4. если передавать в функцию указатель на другую функцию, то какой-то шутник (или просто невнимательный человек) может передать туда 0. Потому приходится все время проверять на 0 перед вызовом по указателю. Есть ли для функций механизм, похожий на ссылочный, который "гарантирует", что передается непустое значение? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Литературку читать не пробовал и поиском пользоваться?
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
да, может есть у кого на примете статья, где рассматривается подноготная указателей на функции?
к примеру, интересует, 5. всегда ли компилятор может оптимизировать вот такое:
Добавлено через 2 минуты и 3 секунды в детстве Незнайку читал пытался найти ответ на первый вопрос, но не смог - даже составить текст запроса на поиск. Если даш "литературку", где ответы на эти вопросы написаны, буду благодарен |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ты уверен, что там есть ответы на эти вопросы?
(второй, заметь - это ПОЧЕМУ. В литературке такие подробности редко пишут) Добавлено через 10 минут и 6 секунд хоть когда-то и читал, но все же поглядел на главу "4.6.9 Указатель на функцию" из рекомендованной "литературки" негусто ни на 1 из вопросов ответа не нашел (хотя дошло, что 2 и 3 взаимосвязанны) может у кого есть "литературка", где это поглубже рассматривается? |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
а чем
не устраивает? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Alek86, недавно прочёл вот эту статью : Member Function Pointers and the Fastest Possible C++ Delegates. Весьма и весьма профессиональный рассказ. Не то чтобы я узнал много нового, но все мои разрозненные знания как бы сложились в общую картину
Это сообщение отредактировал(а) marcusmae - 26.2.2008, 12:09 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
устраивает проблема в том, что я чёто был уверен, что сцылок на функции нету (даже не проверил)... угу, с моим другом-словарем... спасибо, посмотрим-с |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Строго говоря, замена указателя ссылкой не спасет от "шутников". Ибо здесь вам C. Например, разыменуем нулевой указатель и передадим. Все прекрасно скомпилируется. Естественно, получишь в runtime исключение, как и при вызове функции по нулевому указателю, только несколько другое.
То же самое относится и к ссылкам на данные. Ссылка лишь декларирует соглашение - объект должен быть - но никто не мешает нарушать его при желании. Тем не менее функции принято передавать по указателю, а не по ссылке - просто тебя лохо поймут. -------------------- ... |
|||
|
||||
| Alek86 |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
у слова "гарантирует", наверное, не заметила кавычек все равно, что объвление функции константной "гарантирует", что она не будет менять объект а инкапсуляция "гарантирует" неприкосновенность приватных переменных но за труды в написании спасибо в смысле плохо? в том, что не только я не знал, что такое ссылка на функцию? ну увидят и просветятся... лучши скажи, как передать в функтор
функцию так, чтобы нормальный оптимизатор вызов
соптимизировал так, чтобы он был аналогичен вызову
MVC 2005 при использовании ссылок оптимизирует их одинаково только если func() не может быть встраиваемой. иначе же:
:( PS. marcusmae, если это есть в той статье, то я ее еще не читал - работа... |
||||||||||
|
|||||||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
существует ли возможность обьявить ссылку на функцию-член класса?
пробовал - не получилось. в стандарте тоже не нашел |
|||
|
||||
| marcusmae |
|
||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
А ещё моя тема здесь на форуме : Передать в класс указатель на функцию, если функция - член другого класса Это сообщение отредактировал(а) marcusmae - 27.2.2008, 14:10 -------------------- ἀπὸ μηχανῆς θεός |
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ключевое слово - "ссылку"
статейку я прочел, и даже + зарядил за нее кстати, русский вариант |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Ого! Ага, я внимательно читаю. Загляни в тему, которую я привёл. В кратце, должно быть что-то вроде
То есть, завести амперсанд не выйдет, а вот взять адрес указателя - вполне -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
угу... а жаль... правда ведь если спрошу, почему нету ссылки, то не уверен, что найдется ответ... я во время компиляции передаю в качестве параметра шаблона... не подходит конечно, проблема решаемая (принимать указатель, и во время компиляции гавкать, если туда 0 записали) но все же... на обычные функции есть, а на члены - нету :( |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Один написал
- другой перевёл
а третий поставил диагноз без аргументации (т.е. нахамил) : Здесь, конечно, можно придраться к словам, т.к. в стандарте это не упоминается, но конструкция эта - специальная для указателей на функции-члены. Это я имел в виду. -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
Стандарт
5.3.1 Unary operators
Это сообщение отредактировал(а) Alek86 - 27.2.2008, 17:32 |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А конструкция *new - специальная для разыменования указателей на объекты, созданные в динамической памяти Если "::*" - это целостный специальный оператор для указателей, то почему следующий код прекрасно скомпилируется
? Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 17:40 |
||||
|
|||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
UnrealMan, так же прекрасно компилируется, как и этот :
Впрочем, чтобы перестало компилироваться, стоит попробовать задать не нулём
Чему в этом примере присвоился p в первой же строчке? Вернее, что это за адрес при том, что функция foo - не статическая, а экземплярная? С этим адресом нечего будет поделать, пока (ниже) не будет создан экземпляр класса A. Я думаю, наличие штуки "::*", специфичной для функций-членов ничем не мешает существованию "::" (scope resolution) и "*" (indirection) вместе и в отдельности. Неправильно думаю? -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
возможно, потому же, почему и такой:
-------------------- qqq |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
В стандарте нет токена "::*". Оператора такого тоже нет. Объявление указателя на член представляет собой
::opt nested-name-specifier * cv-qualifier-seq opt D1 Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 19:13 |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Прекрасно! Вы довольны, что случай членов определяется специальным образом? Может быть, вы пытаетесь доказать, что указатели на функции и обычные указатели - это одно и то же? Об этом я уже сказл чуть выше. О чём же спор? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
спор о том, что я и хочу узнать
ты сказал
в ответ в несколько необычной форме тебе сказали, что это неправда и "::&" имеет такие же права на существование так почему нету сцылок, будь они неладны, на функции-члены? |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Не знаю
аргументом не может быть указатель на член или метод, т.к. тип T в таких случаях не может быть выведен. Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 20:33 |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
Я уж не знаю как ещё объяснить. Я имел в виду, что данная нотация имеет специальный смысл для указателей на функции-члены классов и привёл этому пример кода, в котором укзатель получал некоторое значение фактически до того, как был построен экземпляр класса с данной функцией.
Неправда, для указателей такой конструкции нет (и ::* не было бы, если б она не была введена отдельно) -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Думаешь, составление стандарта - это очень просто? Посмотри на рассмотренные комитетом неточности и ошибки текущего стандарта http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html. Не впечатлило? Это только то безобразие, исправление которого уже отражено в текущем рабочем черновике нового стандарта. А теперь взгляни на то, что комитету ещё предстоит пересмотреть для внесения соответствующих поправок в рабочий черновик: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html Снова не впечатлило? Тогда, может быть, ты нам тут перескажешь своими словами содержание этих двух ну совсем маленьких страничек? |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
UnrealMan, НЕТ, я не такой впечатлительный, увы. Мне кажется, для большой и очень иерархичной структуры, объединяющей сотни специалистов и поддерживаемой большими технологическими корпорациями такой уровень прогресса является весьма скромным : от писания (и пересказывания) черновиков толку никакого, если даже действующий чистовик стандрата многими компиляторами реализован неполностью. Впрочем, в листах ли, в цифрах оценивать - всё-равно ничего не будет значить. Важно качество. Но я вообще-то не об этом. Чтобы не делать некоторые вещи, вовсе не обязательно сбиваться с ног -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 5 Всего: 39 |
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
с каких пор мелкомягкие стали заботиться о С++?
у них свое детище растет |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |