Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатели на функции, несколько вопросов на одну тему 
V
    Опции темы
UnrealMan
Дата 27.2.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(marcusmae @  27.2.2008,  14:30 Найти цитируемый пост)
"::*" - это целостный специальный оператор для указателей.

Бред.
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Один написал

Цитата

a special operator (::*) is used


- другой перевёл

Цитата

используется специальный оператор ( ::* )


а третий поставил диагноз без аргументации (т.е. нахамил) :

Цитата(UnrealMan @  27.2.2008,  15:58 Найти цитируемый пост)
Бред.


 smile 

Здесь, конечно, можно придраться к словам, т.к. в стандарте это не упоминается, но конструкция эта - специальная для указателей на функции-члены. Это я имел в виду.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 27.2.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Стандарт
5.3.1 Unary operators

Цитата

struct A { int i; };
struct B : A { };
... &B::i ... // has type int A::*


Это сообщение отредактировал(а) Alek86 - 27.2.2008, 17:32


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 27.2.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(marcusmae @  27.2.2008,  17:07 Найти цитируемый пост)
но конструкция эта - специальная для указателей на функции-члены

А конструкция *new - специальная для разыменования указателей на объекты, созданные в динамической памяти smile

Если "::*" - это целостный специальный оператор для указателей, то почему следующий код прекрасно скомпилируется

Код
int (std::string::
*p)() = 0;

?


Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 17:40
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



UnrealMan, так же прекрасно компилируется, как и этот :

Код

int (*p)() = 0;


Впрочем, чтобы перестало компилироваться, стоит попробовать задать не нулём smile 

Код

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

struct A { int foo() { return - 1; } };

int _tmain(int argc, _TCHAR* argv[])
{
    int (A::*p)() = &A::foo;
    A a;
    cout << (a.*p)();
    return 0;
}


Чему в этом примере присвоился p в первой же строчке? Вернее, что это за адрес при том, что функция foo - не статическая, а экземплярная? С этим адресом нечего будет поделать, пока (ниже) не будет создан экземпляр класса A.

Я думаю, наличие штуки "::*", специфичной для функций-членов ничем не мешает существованию "::" (scope resolution) и "*" (indirection) вместе и в отдельности. Неправильно думаю?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
maxim1000
Дата 27.2.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(UnrealMan @  27.2.2008,  17:39 Найти цитируемый пост)
то почему следующий код прекрасно скомпилируется

возможно, потому же, почему и такой:
Код

int *x=new int[10];
delete
[]
x
;




--------------------
qqq
PM WWW   Вверх
UnrealMan
Дата 27.2.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



В стандарте нет токена "::*". Оператора такого тоже нет. Объявление указателя на член представляет собой
::opt nested-name-specifier * cv-qualifier-seq opt D1

Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 19:13
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата(UnrealMan @  27.2.2008,  19:12 Найти цитируемый пост)
Объявление указателя на член представляет собой::opt nested-name-specifier * cv-qualifier-seq opt D1


Прекрасно! Вы довольны, что случай членов определяется специальным образом? Может быть, вы пытаетесь доказать, что указатели на функции и обычные указатели - это одно и то же? 

Цитата(UnrealMan @  27.2.2008,  19:12 Найти цитируемый пост)
В стандарте нет токена "::*". Оператора такого тоже нет.


Об этом я уже сказл чуть выше. О чём же спор?



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 27.2.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



спор о том, что я и хочу узнать
ты сказал
Цитата(marcusmae @  27.2.2008,  14:30 Найти цитируемый пост)
Ого!   Если что, "::*" - это целостный специальный оператор для указателей.

в ответ в несколько необычной форме тебе сказали, что это неправда и "::&" имеет такие же права на существование


так почему нету сцылок, будь они неладны, на функции-члены? smile



--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 27.2.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alek86 @  27.2.2008,  19:51 Найти цитируемый пост)
так почему нету сцылок, будь они неладны, на функции-члены?

Спроси у комитета.
PM MAIL   Вверх
Alek86
Дата 27.2.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(UnrealMan @  27.2.2008,  20:04 Найти цитируемый пост)
Спроси у комитета.

неужели ты не знаешь? )


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 27.2.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Не знаю smile Видимо, некогда было придумывать правила для работы с такими ссылками, и потому решили ограничиться указателями. Не существует не только ссылок на члены класса, но и типов, которые можно было бы считать прототипами указателей на члены и функции-члены. Т.е., например, здесь

Код

template <class T>
    void f(T *);

аргументом не может быть указатель на член или метод, т.к. тип T в таких случаях не может быть выведен.

Это сообщение отредактировал(а) UnrealMan - 27.2.2008, 20:33
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Я уж не знаю как ещё объяснить. Я имел в виду, что данная нотация имеет специальный смысл для указателей на функции-члены классов и привёл этому пример кода, в котором укзатель получал некоторое значение фактически до того, как был построен экземпляр класса с данной функцией.

Цитата(Alek86 @  27.2.2008,  19:51 Найти цитируемый пост)
"::&" имеет такие же права на существование

Неправда, для указателей такой конструкции нет (и ::* не было бы, если б она не была введена отдельно)

Цитата(UnrealMan @  27.2.2008,  20:32 Найти цитируемый пост)
некогда было придумывать правила для работы с такими ссылками

smile наверно члены Комитета подались на заработки - свободного времени мало...



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
UnrealMan
Дата 27.2.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(marcusmae @  27.2.2008,  21:01 Найти цитируемый пост)
наверно члены Комитета подались на заработки - свободного времени мало...

Думаешь, составление стандарта - это очень просто? Посмотри на рассмотренные комитетом неточности и ошибки текущего стандарта http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html. Не впечатлило? Это только то безобразие, исправление которого уже отражено в текущем рабочем черновике нового стандарта. А теперь взгляни на то, что комитету ещё предстоит пересмотреть для внесения соответствующих поправок в рабочий черновик: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html Снова не впечатлило? Тогда, может быть, ты нам тут перескажешь своими словами содержание этих двух ну совсем маленьких страничек? smile Ведь комитету почти совсем нечем заниматься!
PM MAIL   Вверх
marcusmae
Дата 27.2.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



 smile 

UnrealMan, НЕТ, я не такой впечатлительный, увы. Мне кажется, для большой и очень иерархичной структуры, объединяющей сотни специалистов и поддерживаемой большими технологическими корпорациями такой уровень прогресса является весьма скромным : от писания (и пересказывания) черновиков толку никакого, если даже действующий чистовик стандрата многими компиляторами реализован неполностью. Впрочем, в листах ли, в цифрах оценивать - всё-равно ничего не будет значить. Важно качество.

Но я вообще-то не об этом. Чтобы не делать некоторые вещи, вовсе не обязательно сбиваться с ног smile Что-то не делается потому, что не востребовано в данный момент или не принято сообществом. Поэтому Ваша фраза звучала комично.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.