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

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

27.03.2017, 01:13. Показов 4216. Ответов 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
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 01:16
какие еще флаги? компиляции? а если не ставить, компилируется? компилируется! с потерей данных в вашем примере сужающее преобразование не есть ошибка компиляции.
статик каст еще проканает при приведении из базового в производный. неявно базовый в производный не преобразуется. значит ваш Прат вам наврал.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
27.03.2017, 01:23
Цитата Сообщение от daslex Посмотреть сообщение
Под она имеется в виду операция static_cast
C++
1
y=(char)x;
так понятней?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2017, 01:26
Цитата Сообщение от daslex Посмотреть сообщение
y = x не будет компилироваться.
будет.
при этом компилятор может выдать предупреждение:
warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion]
он предупреждает - тут может быть проблема.
потеря данных.

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

после чего компилятор уже не кидает нам ворнинги.
1
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
27.03.2017, 01:30
Небезопасное преобразование типа с помощью оператора static_cast не*
обходимо для того, чтобы получить переменную в виде последовательно*
сти байтов.

443
Страуструп Б. - Программирование. Принципы и практика с использованием C++ (2е издание) - 2016
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 01:31  [ТС]
Вот это вообще-то вне закона:
C++
1
2
  int x[] = {static_cast<int>(1.0),static_cast<int>(2.0),static_cast<int>(3.0)};
  x[0]++; //чтоб дало скомпилироваться иногда использую
Если я ничего не путаю.

Я проверил, прежде чем написать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main(){
  int x = 32;
  char y = 2;
 
  y = static_cast<char>(x);
  x = static_cast<int>(y);
 
  y=x; //error: implicit conversion loses integer precision: 'int' to 'char' [-Werror,-Wconversion]|
}
PHP
1
clang++.exe -O3 -pedantic -Weverything -Wall -pthread -std=c++1z -Wall -Wextra -Werror -pedantic   -IC:\MinGW\lib\gcc\mingw32\5.3.0\include\c++ -IC:\MinGW\lib\gcc\mingw32\5.3.0\include\c++\mingw32\ -IC:\MinGW\include -c
0
 Аватар для Amadara
21 / 21 / 5
Регистрация: 17.12.2014
Сообщений: 322
27.03.2017, 01:35
Цитата Сообщение от daslex Посмотреть сообщение
Вот это вообще-то вне закона:
C++
1
2
  int x[] = {static_cast<int>(1.0),static_cast<int>(2.0),static_cast<int>(3.0)};
  x[0]++; //чтоб дало скомпилироваться иногда использую
Если я ничего не путаю.

Я проверил, прежде чем написать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main(){
  int x = 32;
  char y = 2;
 
  y = static_cast<char>(x);
  x = static_cast<int>(y);
 
  y=x; //error: implicit conversion loses integer precision: 'int' to 'char' [-Werror,-Wconversion]|
}
PHP
1
clang++.exe -O3 -pedantic -Weverything -Wall -pthread -std=c++1z -Wall -Wextra -Werror -pedantic   -IC:\MinGW\lib\gcc\mingw32\5.3.0\include\c++ -IC:\MinGW\lib\gcc\mingw32\5.3.0\include\c++\mingw32\ -IC:\MinGW\include -c

да вроде норм все
Миниатюры
Не очень понимаю static_cast  
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 01:37
так у вас параметры компиляции такие, чтобы ворнинги как ошибки выдавались. в целом стандарт такой неявный каст разрешает. код сточки зрения правил с++ корректный без явных кастов.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 01:45  [ТС]
Вот имеет смысл говорить "не запрещает", а не "разрешает". Тут как бы разница огромна.
Но тогда что это за двойные стандарты с Ill-formed?

Объект из моего кода ill-formed - да и фиг с ним.
Вектор констант ill-formed - табу.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 01:49
буквоедство какое-то. не вижу разницы. что меняется если употребить "разрешает" вместо "не запрещает" или наоборот?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 01:50  [ТС]
Цитату из стандарта, где он разрешает давайте. Коли на то пошло.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 01:56
я не знаю как именно там это написано.
вы разницу то можете объяснить?
вот допустим там написано,
1: разрешено преобразование int в char.
2: не запрещено преобразование int в char.
как меняются трактовки этого в первом и втором случае?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 01:56  [ТС]
Разница в том, что то, что сегодня явно не разрешено, завтра может быть запрещено. А то, что разрешено, запрещено будет не скоро или вообще не будет запрещено.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 02:03
если в стандарте писанина со смыслом: int неявно преобразуется в char, то этот смысл будет оставаться долго, вне зависимости от формулировки (разрешено или не запрещено). Вот если бы явно не было написано что-то, что трактуется как инт преобразуется в чар, тогда да, рассчитывать на такое неявное преобразование не стоит.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
27.03.2017, 02:09  [ТС]

Не по теме:

Как кусок, вырванный из контекста, смысл в этом будет вечный.



Добавлено через 2 минуты
Если у меня запрет на это преобразование, то почему его static_cast ест? После чтения того, что я обернул в цитату, логично ожидать, что static_cast должен нас защитить.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.03.2017, 02:14
при неявном сужающем преобразование как правило компиляторы выдают соответствующий ворнинг.
у вас флаги компиляции такие, что ворнинги интерпретируются как ошибки.
статик_каст подавляет этот ворнинг. нет ворнинга - нет ошибки при ваших флагах.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
27.03.2017, 02:41
Лучший ответ Сообщение было отмечено daslex как решение

Решение

Цитата Сообщение от daslex Посмотреть сообщение
Сужающее преобразование, которое так-то запрещено, и если флаг поставить нужный, то y = x не будет компилироваться. Тип int неявно не должен бы мочь приводится к типу char, как ни думай.
Тем не менее static_cast это ест и не давится, хотя, если верить цитате, подавиться бы должен.

Чего я не понимаю?
Сужающие преобразования в С++ запрещены не глобально, а только в четко оговоренных контекстах. Фактически это только случаи, когда инициализация использует синтаксис { ... }. А также в нетиповых параметрах шаблонов. К данному случаю этот запрет не относится никак. y = x разрешено всегда.

А что там у вас за флаг компилятора, который запрещает y = x - это к языку не относится.
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2017, 02:46
Цитата Сообщение от daslex Посмотреть сообщение
Я проверил, прежде чем написать.
смотрим сюда:
Цитата Сообщение от Amadara Посмотреть сообщение
clang++.exe -O3 -pedantic -Weverything -Wall -pthread -std=c++1z -Wall -Wextra -Werror -pedantic *
обращаем внимание на:
-Werror

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

тобишь сам код компилируется без ошибок.
но с таким волшебным ключиком,
вместо ворнингов генерируется ошибка компиляции.
error: conversion to ‘char’ from ‘int’ may alter its value [-Werror=conversion]
просто компилятор с такой настройкой,
вместо того, что бы кидать ворнинги,
будет генерить ошибки компиляции.

Добавлено через 1 минуту
Цитата Сообщение от Amadara Посмотреть сообщение
Небезопасное преобразование типа с помощью оператора static_cast не*
обходимо для того, чтобы получить переменную в виде последовательно*
сти байтов.
бред какой то.
1
27.03.2017, 02:49

Не по теме:

Мне конечно не особа интересна эта тема, но в очередной раз впечатляет эрудированность TheCalligrapher! :senor:

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2017, 02:49
Цитата Сообщение от DU3 Посмотреть сообщение
статик_каст подавляет этот ворнинг
ничего он не подавляет.

ворнинги подавляют соответствующие ключики
или соответствующие прагмы.

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru