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

Поиск:

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


Эксперт
****


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

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



Предисловие:
Иногда необходимо производить явное преобразование типа. Я понимаю, что это, скорее всего, из-за неправильной архитектуры, но ситуации бывают разные. Например, если используешь готовую функцию, как в QIODevice
Цитата
qint64 write ( const char * data, qint64 maxSize )

если у меня массив unsigned char x[1000], то я должен в явном виде преобразовать указатель на него к char*.
Я всегда ( по привычке, а не потому, что это правильно ) делаю преобразование в стиле Си
Код

write( ( char * ) x, ... 

Вопрос:
в чём существенное отличие такого преобразования от Си++-сного reinterpret_cast. И в чём отличие reinterpret_cast от static_cast.
Спасибо

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


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


Шустрый
*


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

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



Привет.

Преобразование в стиле С приводит без проверки типов данных при условии что кастование таких типов впринципе возможно.

static_cast является почти аналогом сишного кастования но добавляет проверки типов:

Код

   char* a;
   static_cast<unsigned long>(a);                  // Не компилится
   (unsigned long)(a);                                     // компилится




>> И в чём отличие reinterpret_cast от static_cast.
reinterpret_cast применяется при кастовании поинтеров:

Код

   char* a;
   static_cast<unsigned long*>(a);               // Не компилится
   reinterpret_cast<unsigned long*>(a);       // Компилится

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


pattern`щик
****


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

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



Цитата(borisbn @  16.9.2010,  10:06 Найти цитируемый пост)
в чём существенное отличие такого преобразования от Си++-сного reinterpret_cast.

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

Цитата(borisbn @  16.9.2010,  10:06 Найти цитируемый пост)
И в чём отличие reinterpret_cast от static_cast.

вот  smile

Добавлено через 44 секунды
вай, Алена фотку сменила.
PM WWW   Вверх
mrbrooks
Дата 16.9.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 2
Всего: 306



borisbn, ко всему выше сказанному добавлю что reinterpret_cast аццкая вещь и использовать ее нужно осторожно. 
у нее были проблемы с выравниванием. 

Цитата(boostcoder @  16.9.2010,  11:31 Найти цитируемый пост)
вай, Алена фотку сменила. 

ололо. ну ты особо не увлекайся. рабочий день еще только начался.
PM MAIL   Вверх
azesmcar
Дата 16.9.2010, 10:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(borisbn @  16.9.2010,  10:06 Найти цитируемый пост)
в чём существенное отличие такого преобразования от Си++-сного reinterpret_cast

вообще рекомендуется использовать C++ style cast, но в данном случае сложно назвать какую-то существенную причину.

Цитата(borisbn @  16.9.2010,  10:06 Найти цитируемый пост)
И в чём отличие reinterpret_cast от static_cast.

reinterpret_cast не проверяет ничего, просто проводит cast. Какой угодно указатель к другому (какому угодно).
Код

struct X {};
struct Y {};

int main()
{
    X * xptr = 0;
    Y * yptr = reinterpret_cast<Y*>(xptr);
}


Цитата(borisbn @  16.9.2010,  10:06 Найти цитируемый пост)
И в чём отличие reinterpret_cast от static_cast.

static_cast проводит compile-time проверку, там, где это возможно например
Код

struct X {};
struct Y {};

int main()
{
    X * xptr = 0;
    Y * yptr = static_cast<Y*>(xptr); // ошибка
}

а вот в этом случае все будет работать
Код

struct X {};
struct Y : public X {};

int main()
{
    X * xptr = 0;
    Y * yptr = static_cast<Y*>(xptr); // ОК, преобразование возможно
}

иногда возникают ситуации, когда compile-time проверки недостаточно
Код

struct X {};
struct Y : public X {};
struct Z : public X {};

int main()
{
    X * xptr = new Z;
    static_cast<Y*>(xptr); // OK, cast прошел, хотя не должен был
}

тут можно использовать dynamic_cast, он проверяет runtime, при ошибке приведения возвращает NULL (если возвращает указатель) или генерирует исключение, если возвращает reference.

Добавлено через 37 секунд
Цитата(boostcoder @  16.9.2010,  10:31 Найти цитируемый пост)
второй, умеет бросать исключение при невозможности каста.

 smile это dynamic_cast, и то только тогда, когда делается cast к reference.

Добавлено через 1 минуту и 17 секунд
Цитата(proc_maker @  16.9.2010,  10:16 Найти цитируемый пост)
reinterpret_cast применяется при кастовании поинтеров:

а static_cast типа этого не умеет?
PM   Вверх
Dem_max
Дата 16.9.2010, 10:56 (ссылка)    | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

если у меня массив unsigned char x[1000], то я должен в явном виде преобразовать указатель на него к char*.


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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 16.9.2010, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  09:37 Найти цитируемый пост)
reinterpret_cast не проверяет ничего, просто проводит cast. Какой угодно указатель к другому (какому угодно).

и даже это ? :
Код

  reinterpret_cast<void *> (&C::fn);


Цитата(azesmcar @  16.9.2010,  09:37 Найти цитируемый пост)
static_cast проводит compile-time проверку, там, где это возможно например

разочарую вас, но reinterpret_cast тоже проверяет возможность преобразования, но по своим правилам в отличии от static_cast.

главное отличие в том, что reeinterpret осуществляет "прямое" преобразование, а static, учитывая правила преобразования ( стандартные либо пользовательские для соотв. типов).



Цитата(Dem_max @  16.9.2010,  09:56 Найти цитируемый пост)
даже преобразовывать не нужно, 

может стоит проверить ? 
smile


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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  11:40 Найти цитируемый пост)
и даже это ? :

нет, это уж слишком даже для reinterpret_cast, эти указатели размером не совместимы.

Цитата(mes @  16.9.2010,  11:40 Найти цитируемый пост)
разочарую вас, но reinterpret_cast тоже проверяет возможность преобразования, но по своим правилам в отличии от static_cast.

имелась ввиду проверка по иерархии классов (показано на примере). reinterpret_cast этого не делает.


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


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


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

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



Цитата(azesmcar @  16.9.2010,  10:47 Найти цитируемый пост)
имелась ввиду проверка по иерархии классов

интересно, что подразумевается под словом "проверка" ?

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


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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  11:55 Найти цитируемый пост)
интересно, что подразумевается под словом "проверка" 

проверка можно ли совершать данное преобразование.

Цитата(mes @  16.9.2010,  11:40 Найти цитируемый пост)
и даже это ? :

по поводу этого, не уверен, но мне кажется это все же implementation defined.
PM   Вверх
Abyx
Дата 16.9.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

откуда вы знаете?
в ряде случаев в винде они будут совместимы.

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


uploading...
****


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

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



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

Не всегда. И если в каком-то компиляторе их размер равен это не значит, что они совместимы. я уже кажется писал
Цитата(azesmcar @  16.9.2010,  11:58 Найти цитируемый пост)
по поводу этого, не уверен, но мне кажется это все же implementation defined. 



Это сообщение отредактировал(а) azesmcar - 16.9.2010, 12:07
PM   Вверх
mes
Дата 16.9.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  10:58 Найти цитируемый пост)
проверка можно ли совершать данное преобразование.

тогда следующий вопрос: есть класс B некий наследник класса А, соответсвенно преобразование возможно. Раз проверка прошла, то результат будет всегда ли  одинаков в обоих случаях ?
Код

B b;
static_cast<A&>(b); // 1
reinterpret_cast<A&>(b); // 2

smile



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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  12:06 Найти цитируемый пост)
тогда следующий вопрос: есть класс B некий наследник класса А, соответсвенно преобразование возможно. Раз проверка прошла, то результат будет всегда ли  одинаков в обоих случаях ?

Нет, не всегда. reinterpret_cast игнорирует vtable pointer.

Добавлено через 39 секунд
хотя я не совсем понял каким образом этот вопрос связан с темой проверки возможности преобразования?

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


Опытный
**


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

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



azesmcar, нет, размер указателя на член класса зависит еще и от ОС и назначения этого члена класса.
в ряде случаев ОС будет гарантировать что указатель на член класса будет обычным указателем
PM MAIL   Вверх
azesmcar
Дата 16.9.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Abyx @  16.9.2010,  12:14 Найти цитируемый пост)
azesmcar, нет, размер указателя на член класса зависит еще и от ОС и назначения этого члена класса.
в ряде случаев ОС будет гарантировать что указатель на член класса будет обычным указателем 

повторяю, несовместимыми их делает не компилятор под названием "вставить название по своему желанию" а стандарт, который не гарантирует, что их размеры совпадают.
PM   Вверх
mes
Дата 16.9.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  11:12 Найти цитируемый пост)
reinterpret_cast игнорирует vtable pointer.

не  совсем понятно  что имелось ввиду  по отношению к static_cast.

Цитата(azesmcar @  16.9.2010,  11:15 Найти цитируемый пост)
стандарт, который не гарантирует

с учетом стандарта, не понятно при чем тут вообще vtable 
smile




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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  12:32 Найти цитируемый пост)
не  совсем понятно  что имелось ввиду  по отношению к static_cast.

я же показал на примере.
Код

struct X {};
struct Y {};
int main()
{
    X * xptr = 0;
    Y * yptr = static_cast<Y*>(xptr); // ошибка
}

Код

struct X {};
struct Y : public X {};
int main()
{
    X * xptr = 0;
    Y * yptr = static_cast<Y*>(xptr); // ОК, преобразование возможно
}


Цитата(mes @  16.9.2010,  12:32 Найти цитируемый пост)
с учетом стандарта, не понятно при чем тут вообще vtable 

а где в процитированном сообщении я говорил про vtable?

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

ответ - нет, не всегда. причем тут стандарт? про стандарт я писал в другом сообщении, по другому вопросу и вообще не Вам.

Это сообщение отредактировал(а) azesmcar - 16.9.2010, 12:39
PM   Вверх
mes
Дата 16.9.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  11:34 Найти цитируемый пост)
а где в процитированном сообщении я говорил про vtable? 

в процитицированном не было.. но в двух подряд сообщениях Вы придерживаетесь разных позиций по отношению к стандарту ))

Цитата(azesmcar @  16.9.2010,  11:15 Найти цитируемый пост)
 несовместимыми их делает не компилятор под названием "вставить название по своему желанию" а стандарт, который не гарантирует, что их размеры совпадают. 

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


Цитата(azesmcar @  16.9.2010,  11:34 Найти цитируемый пост)
я же показал на примере.

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

smile

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

связано с тем, что слова "проверка" не достаточно для показания разницы поведения между обсуждаемыми кастами.
Цитата(azesmcar @  16.9.2010,  11:34 Найти цитируемый пост)
ответ - нет, не всегда.

вот именно, не только проверка их различает 
smile


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


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


Опытный
**


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

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



Цитата(azesmcar @  16.9.2010,  13:15 Найти цитируемый пост)
повторяю, несовместимыми их делает не компилятор под названием "вставить название по своему желанию" а стандарт, который не гарантирует, что их размеры совпадают. 

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

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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  12:45 Найти цитируемый пост)
в процитицированном не было.. но в двух подряд сообщениях Вы придерживаетесь разных позиций по отношению к стандарту ))

где? smile 
В одном сообщении я говорил о совместимости, о термине совместимость и том, какой смысл в него вкладывается. В другом сообщении речь шла о совсем другой теме, раз мы говорим о C++ то стандарт надо упоминать всегда и везде, и не важно о чем мы говорим и в каком контексте?

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

наш спор был НЕ про reinterpret_cast и то, почему это преобразование не допускается, а про то, что размеры void* и указателя на member функцию несовместимы. Напомню
Цитата(azesmcar @  16.9.2010,  11:47 Найти цитируемый пост)
эти указатели размером не совместимы

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

если вы тоже считаете их совместимыми - тогда можем поспорить.

Цитата(mes @  16.9.2010,  12:45 Найти цитируемый пост)
размер указателей непричем

а я будто возражаю? я лишь допустил, что не разрешает ИМЕННО из за несовместимости этих указателей.

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

есть еще много чего, множество исключений, разных поведений для разных типов, множество undefined behavior -ов..всего не перескажешь.

Цитата(Abyx @  16.9.2010,  12:51 Найти цитируемый пост)
если компилятор поддерживает определенные ABI где размеры совпадают, то мы знаем в киких случаях размеры совпадут и можем это использовать.

...для написания непереносимого кода, и все таки это не делает их совместимы.

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


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


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

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



Цитата(Abyx @  16.9.2010,  11:51 Найти цитируемый пост)
 то мы знаем в киких случаях размеры совпадут и можем это использовать.

когда есть зависимость от размера, то в стандарте так и пишут :
Цитата

A pointer can be explicitly converted to any integral type large enough to hold it.

а в данном случае для преобразования учтена только одна возможность :
Цитата

An rvalue of type “pointer to member of X of type T1” can be explicitly converted to an rvalue of type “pointer to member of Y of type T2” if T1 and T2 are both function types or both object types


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


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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  12:45 Найти цитируемый пост)
вот именно, не только проверка их различает 

ну так дополняйте, я же не претендую на всеобъемлющий пост.
PM   Вверх
mes
Дата 16.9.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  11:53 Найти цитируемый пост)
есть еще много чего, множество исключений, разных поведений для разных типов, множество undefined behavior -ов..всего не перескажешь.

Хорошо переформулирую :
Цитата

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

на
Цитата

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

smile

Добавлено через 2 минуты и 40 секунд
Цитата(azesmcar @  16.9.2010,  11:56 Найти цитируемый пост)
ну так дополняйте

уже
Цитата(mes @  16.9.2010,  10:40 Найти цитируемый пост)
главное отличие в том, что reeinterpret осуществляет "прямое" преобразование, а static, учитывая правила преобразования ( стандартные либо пользовательские для соотв. типов).

smile



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


uploading...
****


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

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



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

А по моему очень даже характеризует, по моему это и есть основное различие. Лично я reinterpret_cast использую крайне редко, но использую только тогда, когда я лучше компилятора знаю что мне нужно и мне не нужны его проверки. 
PM   Вверх
mes
Дата 16.9.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  12:03 Найти цитируемый пост)
А по моему очень даже характеризует, по моему это и есть основное различие.

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

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

Добавлено через 4 минуты и 5 секунд
Цитата(mes @  16.9.2010,  12:07 Найти цитируемый пост)
если при возможном преобразовании возможны различные результаты для случаев с применением разных кастов, то как "проверка" может повлиять на результат ?
кажись не слишком ясно, лучше перефразировать.

Если оба преобразования возможны, но дают разный результат, то при чем тут "проверка" ?
smile


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


Эксперт
****


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

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



boostcoder, спасибо за ссылку на Алёну ( +1 ). Очень просто и понятно всё рассказано.
Тему закрываю, хотя подозреваю, что война здесь ещё не закончена smile


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


uploading...
****


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

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



mes

давайте сравним описания на разных источниках

http://msdn.microsoft.com/en-us/library/e0w9f63b(VS.80).aspx
Цитата

reinterpret_cast Operator
Allows any pointer to be converted into any other pointer type. 


http://www.cppreference.com/wiki/keywords/reinterpret_cast
Цитата

reinterpret_cast
The reinterpret_cast operator changes one data type into another. It should be used to cast between incompatible pointer types. 


http://www.cplusplus.com/doc/tutorial/typecasting/
Цитата

reinterpret_cast
reinterpret_cast converts any pointer type to any other pointer type, even of unrelated classes.


http://publib.boulder.ibm.com/infocenter/c...erpret_cast.htm
Цитата

reinterpret_cast
A reinterpret_cast operator handles conversions between unrelated types.


все источники как один утвеждают одно - reinterpret_cast грубой говоря производит преобразование одного типа в другой, даже если они никак не связаны (другими словами без проверки на связанность).

Цитата(mes @  16.9.2010,  13:07 Найти цитируемый пост)
если при возможном преобразовании возможны различные результаты для случаев с применением разных кастов, то как "проверка" может повлиять на результат ?

reinterpret_cast много чего не учитывает, но это уже как следствие.
PM   Вверх
mes
Дата 16.9.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  12:13 Найти цитируемый пост)
все источники как один утвеждают одно - reinterpret_cast грубой говоря производит преобразование одного типа в другой, даже если они никак не связаны (другими словами без проверки на связанность).

с "грубой силой" согласен, а вот с "другими словами" - нет.

static_cast не осуществляет проверку на связанность, а преобразовывает в соответствии с пользовательскими преобразованиями (естественно что речь о пользовательских типах).

Добавлено через 2 минуты и 4 секунды
Цитата(azesmcar @  16.9.2010,  12:13 Найти цитируемый пост)
reinterpret_cast много чего не учитывает, но это уже как следствие. 

акцент не на reinterpret_cast, которому и не  нужно ничего этого учитывать
а на static_cast,  поведение которого определяется не только проверкой на связанность.



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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  13:24 Найти цитируемый пост)
static_cast не осуществляет проверку на связанность, а преобразовывает в соответствии с пользовательскими преобразованиями (естественно что речь о пользовательских типах).

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

PM   Вверх
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   Вверх
mes
Дата 16.9.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  14:18 Найти цитируемый пост)
, ведь reinterpret_cast вообще только с указателями работает. 

ммм.. разве ? 


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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  15:28 Найти цитируемый пост)
ммм.. разве ?  

а что, нет? smile 
reference не в счет, это одно и тоже
PM   Вверх
djamshud
Дата 16.9.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



mes, да)


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


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


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

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



Цитата(azesmcar @  16.9.2010,  14:31 Найти цитируемый пост)
а что, нет? 

интегер в указатель .. хотя если грубо то в принципе можно отнести к "только с указателями"

Добавлено @ 15:41
Цитата(azesmcar @  16.9.2010,  14:31 Найти цитируемый пост)
reference не в счет, это одно и тоже 

ну как сказать.. 

ну вот например : http://codepad.org/Lw5JRCml


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


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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  15:40 Найти цитируемый пост)
ну как сказать.. 

ну вот например : http://codepad.org/Lw5JRCml

разница лишь синтаксическая
http://codepad.org/CdLbCjqY
PM   Вверх
mes
Дата 16.9.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  14:47 Найти цитируемый пост)
разница лишь синтаксическая

для interpret`a да, но не для static_cast`a..



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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  15:56 Найти цитируемый пост)
для interpret`a да, но не для static_cast`a..

да, но мы ведь сейчас про reinterpret говорим smile 
Цитата(mes @  16.9.2010,  15:28 Найти цитируемый пост)
, ведь reinterpret_cast вообще только с указателями работает. 

ммм.. разве ?  


PM   Вверх
mes
Дата 16.9.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  16.9.2010,  14:56 Найти цитируемый пост)
да, но мы ведь сейчас про reinterpret говорим

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



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


uploading...
****


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

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



Цитата(mes @  16.9.2010,  16:02 Найти цитируемый пост)
почему сравниваем касты в контексте указателей

сложно сказать smile 
просто я с самого начала полагал, что так и сравниваем, а вы полагали, что иначе. smile 
PM   Вверх
borisbn
Дата 16.9.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  16.9.2010,  15:28 Найти цитируемый пост)
 И что в этом плохого? 

я и не говорил, что плохо
Цитата(borisbn @  16.9.2010,  15:11 Найти цитируемый пост)
всегда так и делал. но тут закрался червь сомнения


Цитата(djamshud @  16.9.2010,  15:28 Найти цитируемый пост)
const_cast это место прекрасно документирует

IMHO и static_cast и reinterpret_cast тоже получше документируют место, чем (), но это - не решающий аргумент, а я как раз хотел увидеть решающий, и не увидел, поэтому пошёл хоронить червя smile


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


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


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

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



Цитата(borisbn @  16.9.2010,  15:38 Найти цитируемый пост)
 поэтому пошёл хоронить червя

по отношению к конвертации char * в unsigned char * или в общем случае ? 


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


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


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

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



borisbn,

>IMHO и static_cast и reinterpret_cast тоже получше документируют место, чем (), но это - не решающий аргумент, а я как раз хотел увидеть решающий, и не увидел, поэтому пошёл хоронить червя

Имхо, обычные касты документировать не нужно, т.к. это не хаки. Действительно хак - избавляться от константности. А преоразование типа - это нормальная практика.


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


Эксперт
****


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

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



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

не считаю это - нормальной практикой. почему если ты ( или кто-то другой ) забыл поставить const, то const_cast - хак, а если ты ( или кто-то другой ) не определил перегруженные функции для всех простых типов, не сделал шаблон, сделал char *, вместо void * - это не хак, а нормально ?


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


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


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

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



borisbn, принудительное кастование типов происходит не по забывчивости, а по необходимости. Тогда, когда автоматическое не срабатывает. Примеров можно придумать много, начиная от передачи чего-то в printf (ой, как не по-плюсовому!:) ) и заканчивая приведением типов по дереву наследования, когда динамический каст не нужен. Я говорю про такое использование кастования. Когда это происходит по чьей-то забывчивости (читай - глупости) - это конечно хак, и тут наверное обозначить его стоит, хотя хак этот - следствие ошибки, допущенной еще до начала написания кода. Так может лучше исправить первопричину? Про кривые библиотеки знаю. Не пользуюсь.

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

Добавлено через 5 минут
ЗЫ. В предыдущем сообщении кривизной я называл грязный хак, а хак by design - гениальный трюк. Сорри за путаницу в терминалогии:).


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


Опытный
**


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

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



djamshud, const_cast - средство языка, так что это по определению не хак.
PM MAIL   Вверх
djamshud
Дата 16.9.2010, 19:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ремарка Капитана. Да, в рамках синтаксиса и семантики языка это весьма годная конструкция, но джамшут с borisbn не стандарт языка грызут, а рассуждают о дизайне приложения и его частей, а так же о культуре программирования в общем. С этой точки зрения попытка записи в const-область - весьма нестандартный поступок. Капитан в курсе, что const_cast случается и из-за кривости рук разработчика АПИ.


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


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


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

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



Цитата(djamshud @  16.9.2010,  18:01 Найти цитируемый пост)
попытка записи в const-область - весьма нестандартный поступок

специально для Капитана:

1. const- объект далеко не всегда реально константный, всего лишь логически.
2. const_cast бывает нужный не только для убирания константности, но и для ее добавления 
smile


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


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(djamshud @  16.9.2010,  16:47 Найти цитируемый пост)
Имхо, обычные касты документировать не нужно, т.к. это не хаки. Действительно хак - избавляться от константности. А преоразование типа - это нормальная практика. 

reinterpret - это ненормальная практика. Но иногда необходимая (обычно из-за "сишности" или непродуманности используемых библиотек, но не в этом суть).

Цитата(mes @  16.9.2010,  19:30 Найти цитируемый пост)
2. const_cast бывает нужный не только для убирания константности, но и для ее добавления 

Ээ.. А можно пример, где это действительно нужно и не произойдёт автоматом? При передачи в функцию, возврате из функции или присваиванию переменной - всегда само отработает (ну это и логично).


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


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


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

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



Цитата(Любитель @  16.9.2010,  18:40 Найти цитируемый пост)
. А можно пример, где это действительно нужно и не произойдёт автоматом? 

там где надо вызвать именно константную версию метода, а имеем не константный объект..



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


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


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


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

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



mes

1. Капитан считает это очевидным:). Он писал не о константной области памяти, а о сферическом нечто, что попадает к нам в руки и представляется константным. В это нечто, по хорошему, писать - ни-ни!
2. Хороший пример. Но тоже весьма нестандартный, значит следует это отметить в коде.

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


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


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


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

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



Цитата(djamshud @  16.9.2010,  19:43 Найти цитируемый пост)
 Он писал не о константной области памяти, а о сферическом нечто, что попадает к нам в руки и представляется константным.

бывает так, что требуется что то изменить объекту, не меняя при этом логической константности.. 
пример тот же внутренний  кэш..  


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


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


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


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

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



mes, конечно. Это не хак, а гениальный трюк:). И парой камментов раньше я это писал. Но мсье прикопался к "хаку", вот я и раскрывал хаковую часть природы const_cast


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


Опытный
**


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

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



const - это как правило запрет на запись времени компиляции, не более того.

Это нормально, если внутри библиотеки объект mutable,
а во внешнем интерфейсе библиотеки он const, чтоб пользовательский код его не трогал.
Код

class SomeLibraryInterface
{
public:
    const Obj* get_obj() { return get_obj_impl(); }
    void change_obj(const Obj* obj) { change_obj_impl(const_cast<Obj*>(obj)); }
private:
    Obj* get_obj_impl();
    void change_obj_impl(Obj* obj);
}

PM MAIL   Вверх
Любитель
Дата 16.9.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(mes @  16.9.2010,  19:56 Найти цитируемый пост)
там где надо вызвать именно константную версию метода, а имеем не константный объект..

Да, согласен. Хотя логически это всё равно очень странно. Обычно константная и неконстантная версия одного метода делают одно и тоже. Иначе это слишком неочевидно, как я считаю (с точки зрения конечного пользователя).

Добавлено через 1 минуту и 49 секунд
Цитата(Abyx @  16.9.2010,  22:55 Найти цитируемый пост)
const - это как правило запрет на запись времени компиляции, не более того.

Ну что-то мне подсказывает, что для локальных переменных "простых типов" const будет означать либо их непосредственную подстановку, либо (если это массив или структура) запись данных в "неменяемую" область памяти. Хотя, очевидно, это компиляторозависимо и т. д.


--------------------
PM MAIL ICQ Skype   Вверх
djamshud
Дата 16.9.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


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


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


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

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



Цитата(Любитель @  16.9.2010,  22:04 Найти цитируемый пост)
Обычно константная и неконстантная версия одного метода делают одно и тоже. Иначе это слишком неочевидно, как я считаю (с точки зрения конечного пользователя).

чтоб далеко не ходить : оператор [] при CopyOnWrite

Добавлено через 6 минут и 40 секунд
Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
Во время конпеляции конст вообще не играет никакой роли.

прям уж никакой ?  smile 

Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
Именно потому кстати, что в рантайме от нее можно избавиться.

а как ?.. а в компил-тайм нельзя избавиться ?

Цитата(djamshud @  16.9.2010,  22:17 Найти цитируемый пост)
 Константность - плюшка для программиста, и все. 

а знаете почему вектор ругается , когда в него auto_ptr запихивают ?
а как работает вышеупомянутое CopyOnWrite ?
и многое другое что с разбегу в голову не приходит.. 
 smile 


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


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


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

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



Я прекрасно знаю, как работает КоВ. По собственному опыту. И благодаря плюшки для программиста в виде константности она реализовывается. Впрочем без нее тоже можно сделать без проблем, но накладных расходов чуть больше.

>прям уж никакой ?

Помимо собственно семантического анализа (что консту можно, а что - нет) и того, что компилятор может размещать статические объекты в константной области памяти, никакой.

>а как ?.. а в компил-тайм нельзя избавиться ?

Кастованием. В компил-тайм компилятор не знает, к каким именно объектам будут применяться неконстантные методы в рантайме. То есть предполагается, что с объектом в рантайме может твориться все, что угодно. Поэтому он никогда не доверяет констам во время проведения оптимизации, самостоятельно вычисляя в какие моменты (участки выполнения) те или иные объекты стопроцентно не будут изменены.

>а знаете почему вектор ругается , когда в него auto_ptr запихивают ?
>а как работает вышеупомянутое CopyOnWrite ?
>и многое другое что с разбегу в голову не приходит.. 

Это все и есть плюшка.


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


pattern`щик
****


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

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



Цитата(mes @  16.9.2010,  23:18 Найти цитируемый пост)
auto_ptr

стыд позор. это же уг. при том древний.

Добавлено через 43 секунды
зы
как отписаться от темы? достали уже уведомления smile 
PM WWW   Вверх
djamshud
Дата 16.9.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



boostcoder, фи, отписаться... А как же поучаствовать в сраче?:)


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


pattern`щик
****


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

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



Цитата(djamshud @  16.9.2010,  23:53 Найти цитируемый пост)
в сраче

правильное слово для происходящего smile 
PM WWW   Вверх
mes
Дата 17.9.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(djamshud @  16.9.2010,  22:41 Найти цитируемый пост)
Это все и есть плюшка. 

а можно тогда пример не плюшки, чтоб понять в чем отличие плюшек от не плюшек smile

Цитата(boostcoder @  16.9.2010,  22:43 Найти цитируемый пост)
при том древний.

ну прежде всего упомянут был как демонстрация опр. технологии, которая не имеет отношения к древности авто_птр.

Добавлено через 5 минут и 35 секунд
Цитата(djamshud @  16.9.2010,  22:41 Найти цитируемый пост)
 В компил-тайм компилятор не знает, к каким именно объектам будут применяться неконстантные методы в рантайме


1. const  это квалификатор логической константности объекта..
2. хотя (вроде) и понимаю о чем Вы хотите сказать, не понятно, как Ваше ожидаемое соотносится с квалификатором const ( особенно учитывая пункт 1. ) 


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


pattern`щик
****


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

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



Цитата(djamshud @  16.9.2010,  23:41 Найти цитируемый пост)
В компил-тайм компилятор не знает, к каким именно объектам будут применяться неконстантные методы в рантайме.

поясните пожалуйста.

Добавлено через 6 минут и 35 секунд
Цитата(djamshud @  16.9.2010,  23:41 Найти цитируемый пост)
Кастованием. В компил-тайм компилятор не знает, к каким именно объектам будут применяться неконстантные методы в рантайме. То есть предполагается, что с объектом в рантайме может твориться все, что угодно. Поэтому он никогда не доверяет констам во время проведения оптимизации, самостоятельно вычисляя в какие моменты (участки выполнения) те или иные объекты стопроцентно не будут изменены.

недогоняю...
PM WWW   Вверх
mes
Дата 17.9.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  16.9.2010,  23:26 Найти цитируемый пост)
недогоняю... 

насколько я понял, Капитан имел ввиду будет ли объект readonly iили нет.
только вот при чем тут const ?! smile   smile 


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


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


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

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



Да, я был в ударе и неправильно интерпретировал слова Abyx. Я о том же твердил. Сорри.


--------------------
'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.1594 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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