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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> (type) vs reinterpret_cast<type>, явное приведение в Си и Си++ 
V
    Опции темы
boostcoder
Дата 16.9.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



azesmcar, mes, господа, не ругайтесь. вы ведь почти интеллигенты smile 
PM WWW   Вверх
azesmcar
Дата 16.9.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(boostcoder @  16.9.2010,  13:38 Найти цитируемый пост)
azesmcar, mes, господа, не ругайтесь. вы ведь почти интеллигенты smile  

а мы и не ругаемся, мы мирно беседуем. smile

Добавлено через 31 секунду
во имя выяснения правды между прочим..для потомков стараемся smile 
PM   Вверх
Abyx
Дата 16.9.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 10



Цитата(mes @  16.9.2010,  12:40 Найти цитируемый пост)
 reinterpret_cast<void *> (&C::fn);

Цитата(azesmcar @  16.9.2010,  12:47 Найти цитируемый пост)
эти указатели размером не совместимы.

Код

#include <cassert>

struct C
{
    void fn();
};

int main()
{
   assert(sizeof(&C::fn) == sizeof(void*));
}

компилим в MSVC, запускаем, ассёрт не срабатывает.

Добавлено через 2 минуты и 25 секунд
пишем
Код

#include <cassert>
struct C
{
    virtual void fn();
};
int main()
{
   assert(sizeof(&C::fn) == sizeof(void*));
}

ассерт возможно срабатывает, зависит от конкретной версии msvc

пишем
Код

#include <cassert>
struct __single_inheritance C
{
    virtual void fn();
};
int main()
{
   assert(sizeof(&C::fn) == sizeof(void*));
}

ассёрт гарантированно не срабатывает

Добавлено через 3 минуты и 41 секунду
подсказка: в MSVC указатель на функцию член не является обычным указателем тогда и только тогда, когда функция виртуальная и возможно множественное наследование.

Это сообщение отредактировал(а) Abyx - 16.9.2010, 13:55
PM MAIL   Вверх
boostcoder
Дата 16.9.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Abyx @  16.9.2010,  13:55 Найти цитируемый пост)
в MSVC, запускаем, ассёрт не срабатывает.

что-то у меня иной результат. и полагаю - правильный.
http://liveworkspace.org/code/24c04c97f407...33bbad04cc30050

Добавлено через 1 минуту и 56 секунд
как дополнение: http://liveworkspace.org/code/4dd7dd41b34b...91ed7d46d397852
PM WWW   Вверх
Abyx
Дата 16.9.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 10



boostcoder, на liveworkspace.org MSVC ?
PM MAIL   Вверх
mes
Дата 16.9.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(azesmcar @  16.9.2010,  12:35 Найти цитируемый пост)
о каких пользовательских преобразованиях идет речь, когда мы говорим о преобразовании указателей?

в данном случае о преобразованиях в соответствии с иерархией наследования.

Добавлено @ 14:15
Цитата(boostcoder @  16.9.2010,  12:38 Найти цитируемый пост)
azesmcar, mes, господа, не ругайтесь

странные у Вас представления о ругани smile
Цитата(azesmcar @  16.9.2010,  12:39 Найти цитируемый пост)
а мы и не ругаемся, мы мирно беседуем

smile

Добавлено @ 14:18
Цитата(mes @  16.9.2010,  13:14 Найти цитируемый пост)
Цитата(azesmcar @  16.9.2010,  12:35 )
о каких пользовательских преобразованиях идет речь, когда мы говорим о преобразовании указателей?

в данном случае о преобразованиях в соответствии с иерархией наследования.


т.е. другими словами, при статик_касте изменяется не только тип, но может измениться значение указателя, если оно не NULL..  а раз значение меняется , то это не проверка.
smile



Это сообщение отредактировал(а) mes - 16.9.2010, 14:20


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


pattern`щик
****


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

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



Цитата(Abyx @  16.9.2010,  14:10 Найти цитируемый пост)
на liveworkspace.org MSVC ?

нет. просто, абсолютно не понятно, почему MSVC дает такой результат...
PM WWW   Вверх
Abyx
Дата 16.9.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 10



boostcoder, потому что MSVC поддерживает определенные ABI win32, экспорт методов и COM
PM MAIL   Вверх
mes
Дата 16.9.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  16.9.2010,  13:19 Найти цитируемый пост)
 почему MSVC дает такой результат... 

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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 16.9.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(mes @  16.9.2010,  14:14 Найти цитируемый пост)
в данном случае о преобразованиях в соответствии с иерархией наследования.

не совсем понял о чем это

я так понял речь идет об этом (пользовательские преобразования)
Код

#include <iostream>

struct X
{
    X(int a) : x(a) {}
    int x;
};

struct Y
{
    Y(int a) : y(a) {}
    operator X() const
    {
        return X(y);
    }
    int y;
};

int main()
{
    X obj = static_cast<X>(Y(10));
    std::cout << obj.x;
}

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

Добавлено через 3 минуты и 56 секунд
Цитата(mes @  16.9.2010,  14:14 Найти цитируемый пост)
т.е. другими словами, при статик_касте изменяется не только тип, но может измениться значение указателя, если оно не NULL..  а раз значение меняется , то это не проверка.

значение конечно может и меняться, это же cast, но это не отменяет факта проверки. Я же не говорил, что static_cast это только проверка.
PM   Вверх
djamshud
Дата 16.9.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Использую только ()-кастование и dynamic_cast. Все остальное - синтаксическое излишество.

Добавлено через 14 секунд
конс_каст не в счет.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
borisbn
Дата 16.9.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



djamshud, всегда так и делал. но тут закрался червь сомнения. Если верить статье, которую привёл boostcoder, то
Цитата

Что делает приведение типов в стиле С: пытается использовать static_cast, если не получается, использует reinterpret_cast. Далее, если нужно, использует const_cast .


Это сообщение отредактировал(а) borisbn - 16.9.2010, 15:11


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 16.9.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(azesmcar @  16.9.2010,  13:32 Найти цитируемый пост)
 если мы говорим об указателях

это я наверно упустил.. я думал мы об общем сравнении reinterpreta и статика.

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

Цитата(azesmcar @  16.9.2010,  13:32 Найти цитируемый пост)
Я же не говорил, что static_cast это только проверка. 

Я придрался к фразе, смыслом которой был, что статик_каст отличается от реинтерпрет_каста наличием проверки.
И высказал свое имхо, что суть не в наличие проверки, а в различном способе приведений,
которое для одних и тех же данных может дать разный результат в зависимости от типа  каста.



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 16.9.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(mes @  16.9.2010,  15:13 Найти цитируемый пост)
это я наверно упустил.. я думал мы об общем сравнении reinterpreta и статика.

аа..ну автор писал про указатели, я отвечал про указатели..вообще весь разговор вел в этом контексте.. smile 

Цитата(mes @  16.9.2010,  15:13 Найти цитируемый пост)
Я придрался к фразе, смыслом которой был, что статик_каст отличается от реинтерпрет_каста наличием проверки.

ну я имел ввиду в контексте каста указателей, другого сравнения я и не предполагал, ведь reinterpret_cast вообще только с указателями работает.
PM   Вверх
djamshud
Дата 16.9.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



borisbn, все правильно там написано. И что в этом плохого? Если начинаются пляски с определенным кастом, значит что-то пошло не так намного раньше написания кода. А const_cast я выделил отдельно, только потому, что это огромнейшая кривизна, либо хак by design, в обоих случаях const_cast это место прекрасно документирует.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.4416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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