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

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

27.03.2017, 01:13. Показов 4275. Ответов 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 / 1575 / 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
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru