Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

Не очень понимаю static_cast

27.03.2017, 01:13. Показов 4516. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цитирую Прата:
static_cast <имя-типа> (выражение)
Она допустима только в том случае, если имя-типа может быть неявно преобразовано в тип, который имеет выражение, или наоборот.
Под она имеется в виду операция static_cast

Эксперимент:
C++
1
2
3
4
5
6
int main(){
  int x = 32;
  char y = 2;
 
  y = static_cast<char>(x);
}
Сужающее преобразование, которое так-то запрещено, и если флаг поставить нужный, то y = x не будет компилироваться. Тип int неявно не должен бы мочь приводится к типу char, как ни думай.
Тем не менее static_cast это ест и не давится, хотя, если верить цитате, подавиться бы должен.

Чего я не понимаю?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2017, 01:13
Ответы с готовыми решениями:

Не очень понимаю как сделать это
Не очень понимаю как реализовать это, помогите пожалуйста

Не очень понимаю в чем ошибка?
Задача :Вводится строка, включающая строчные и прописные буквы. Требуется вывести ту же строку, заменив в ней строчные буквы прописными, а...

Не понимаю, как ставится Google Chrome. Очень долго
Перенесено из www.cyberforum.ru Я поставил гугл хром, он ставился не меньше получаса, а то и более. Что очень меня удивило. Программа...

24
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 03:13  [ТС]
Студворк — интернет-сервис помощи студентам
Вот, что пишет Прата:
Обычное приведение типов в C++ также ограничено. В основном оно может делать то же, что и другие приведения, плюс сочетания вроде static_cast или reinterpret_cast, за которыми следует const cast. Но это, пожалуй, и все. Так что следующее приведение допустимо в С, но обычно запрещено в C++, потому что в большинстве реализаций C++ тип char слишком мал, чтобы содержать указатель:
char ch = char (&d) ; // приведение типа #2 — преобразование адреса в символ Такие меры предосторожности имеют смысл, но если вы считаете их излишними — к вашим услугам язык С.
Точно так же тип char мал, чтобы содержать int, c оговоркой, что тип char не равен типу int. Следовательно, такое приведение, какое я использую, в С++ должно быть запрещено, но мы тут дружно будем компилятору С++ разрешать делать сишные выходки.
clang, к слову, разрешает такое приведение. Я к тому, что есть тут запретное: сужающее преобразование.
И эта отговорка, что флаги у меня стоят, а static_cast плюёт на эти флаги, слабо на меня действует. И отговорки, что стандартом разрешено, против текстов Прата мало внушают доверия.

Добавлено через 5 минут

Не по теме:

Сейчас на страницу назад перелистну. Когда последнее писал, не прочитал хвоста на первой.



Добавлено через 9 минут
Да. Калиграфер дал очень понятный ответ: флаги компилятора к языку не относятся.
Вот чего я не понимал.

Но сейчас я не понимаю разрешено/запрещено. Вот пишет Прата "обычно запрещено", а тут все единогласно "всё норм, не паникуй". Ахорет какой-то.

Добавлено через 8 минут

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Мне конечно не особа интересна эта тема
Кота в мешке не утаишь :friends:

0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
27.03.2017, 10:26
Цитата Сообщение от daslex Посмотреть сообщение
char ch = char (&d) ;
Дело тут не в размере, без reinterpret_cast нельзя привести указатель ни к одному целочисленному типу (и тем более вещественному)
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 10:40  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
бред какой то.
Этот бред бредом оказывается только потому что эта приведённая цитата, которая есть бред, нагло выдрана из контекста, без разбора.

Речь же идёт там об обычной функции:
C++
1
2
3
4
5
template<class T>
char* as_bytes(T& i){
    void* addr = &i;
    return static_cast<char*>(addr); //Небезопасный static_cast
}
Небезопасное преобразование типа с помощью оператора static_cast необходимо для того, чтобы получить переменную в виде последовательности байтов.
Почему оно небезопасное, мне, например, не понятно. Потому что некоторые источники утверждают:
Conversion of any pointer to pointer to void and back to pointer to the original (or more cv-qualified) type preserves its original value.
Приведение любого указателя к указателю на void и обратно, к исходному указателю, сохраняет тип своего оригинального значения.

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

Добавлено через 2 минуты

Не по теме:

Operok, Это не Вам адресовано. Во избежание путаницы.

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,327
27.03.2017, 10:42
Цитата Сообщение от Operok Посмотреть сообщение
Дело тут не в размере, без reinterpret_cast нельзя привести указатель ни к одному целочисленному типу (и тем более вещественному)
Но в данном случае char(&d) или (char) &d - это и есть reinterpret_cast. Спецификация reinterpret_cast ясно говорит, что с его помощью можно привести указатель к целочисленному типу, который достаточно велик для того, чтобы содержать этот указатель.

В данном случае целочисленный тип недостаточно велик. Поэтому и явный reinterpret_cast тут не поможет - ошибка будет точно та же.

Так что дело тут именно в размере.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 22:17  [ТС]
Цитата Сообщение от Operok Посмотреть сообщение
reinterpret_cast
Вот именно вот этот каст все хором советуют использовать в последнюю очередь, вообще не использовать, что ж мне теперь, им static_cast заменить?

Добавлено через 29 минут
Может ли такое быть, что преобразование
Цитата Сообщение от daslex Посмотреть сообщение
если имя-типа может быть неявно преобразовано в тип, который имеет выражение, или наоборот.
Я не понимаю вот этой строчки.
Есть 4 варианта:
- Тип выражения может быть приведён к указанному типу.
- Тип выражения не может быть приведён к указанному типу.
или наоборот
- Указанный тип может быть приведён к типу выражения.
- Указанный тип не может быть приведён к типу выражения.

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

Я так понял, только потому что в переводе так написано, может что-то другое имеется в виду, потому что странно думать, что static_cast опасный, если он способен кругами, что ли, приводить типы друг к другу.

Я из-за "или наоборот" в замешательстве.

Добавлено через 1 минуту
Может кто толково разъяснит, что имелось в виду? Вероятно в книге неточность перевода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2017, 22:17

ERD Comander как пользоваться ей, не понимаю, очень нужно
читала ,что нужно записывать образ в определённую папку на диск,при запуске жать ф12,выбирать двдишник и будет мне счастье,но как там что...

несколько очень детских вопросов(( ничего не понимаю иначе.
Здравствуйте форумчане. Очень нуждаюсь в консультации. собирал схемку с импульсной лампой ИФК 2000. основные части схемы: 1....

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

Не понимаю как сделать. Очень нужно. прошу объяснить
очень желательно примеры

Описать функцию NOD2(A, B) целого типа. Не очень понимаю функции
Описать функцию NOD2(A, B) целого типа, находящую наибольший общий делитель (НОД) двух целых положительных чисел A и B, используя алгоритм...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru