0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
|
||||||
1 | ||||||
Временные объекты встроенного типа21.01.2015, 18:45. Показов 3077. Ответов 16
Метки нет (Все метки)
Привет! пытаюсь углубляться в C++, решил почитать книгу Саттера, на первом примере, остановился и запутался, там в конце, в виде советов, которыми должен пользоваться человек при использовании итераторов, написано следующее
"4 . Некорректные встроенные операции. Не пытается ли код модифицировать временный объект встроенного типа( как в случае --e.end()" я не смог понять смысл этого, написал такой пример, и он вроде работает вот,
Всем спасибо за внимание и помощь!!!
0
|
21.01.2015, 18:45 | |
Ответы с готовыми решениями:
16
Временные объекты и ссылки Теория, Временные объекты Ссылки на временные объекты Необязательные временные объекты |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
21.01.2015, 19:22 | 2 |
Ответ на этот вопрос есть в книге чуть выше по тексту:
В данном случае работает, потому что итератор - это не объект встроенного типа в реализации стандартной библиотеки твоего компилятора. Саттер говорит о том, что нет гарантий, что это всегда будет так.
1
|
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
|
||||||
21.01.2015, 22:51 [ТС] | 3 | |||||
Спасибо Большое, за ответ, теперь я понял почему у меня код работает !!! Просто меня сама формулировка
Временные переменные встроенного типа смутила, я не могу смысл понять, почему они так называются. теперь я вот так понимаю, почему так делать нельзя, Схожая ситуация получается и при возврате константной ссылки, как здесь :
Спасибо!!! А вот почему они так называются я понять не могу Временные - ? Встроенного - ?(есть предположение,что это потому что итераторы преобразуется к указателю ?) Спасибо ещё раз за внимание и помощь!!!
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
21.01.2015, 23:07 | 4 |
ознакомтесь еще с 19 правилом из вот этой книги:
http://rsdn.ru/res/book/cpp/most_effective_cpp.xml Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов Автор: Скотт Мейерс как раз по теме временных объектов. может станет более понятно. из нее я вот такой вывод сделал: изменения временного объекта встроенного типа никто не заметит. результат изменения никуда не присовить. поэтому нефиг это делать. встроенные - это всякие там инты, чары, указатели на любые объекты. не встроенные, они же пользовательские - это классы и прочее. с изменением пользовательских временных объектов - ситуация такая: можно считать изменением вызов неконстантного метода. он может иметь побочный эффект и изменения распространятся за пределы этого объекта. поэтому запрещать вроде не стоит. изменить за счет изменения какого-то публичного члена. тут вроде как изменения никто не заметит. разрешено это или нет - хз. но делать так наверно не стоит, т.к. это изменение никто не заметит.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
21.01.2015, 23:08 | 5 |
Сообщение было отмечено Misha_prog как решение
Решение
Ну я же привел цитату. В русском издании разве про это не написано? Я просто не имею возможности посмотреть, у меня эта книжка на английском.
Саттер пишет, что итератор в векторе может быть обычным указателем, а не каким-то классом, например. А указатель - это встроенный тип. Временная переменная - это то, что возвратила нам функция end(). Правильно это назвается r-value. Итого, если итератор в векторе реализован через обычный указатель и мы начинаем менять rvalue (посредством операции ++), которое возвратила нам end(), то получим ошибку компиляции. Если же итератор - это какой-то класс, то ошибки не будет, код скомпилируется. Поэтому он и говорит, что так делать не нужно. Потому что писать код, который зависит от
1
|
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
|
|
22.01.2015, 17:33 [ТС] | 6 |
Спасибо Огромное за помощь!!!Теперь понял!
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
22.01.2015, 18:31 | 7 | |||||||||||||||
Я одного так и не понял: а почему нельзя то? Смысли, почему нельзя менять состояние временного объекта фундаментального типа?
Получается, что принципиальной разницы между:
(создание ещё одного временного объекта во втором примере опускаем). Ну и в чем проблема то? С чем связанно ограничение?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
23.01.2015, 00:08 | 8 |
Рискну предположить, что причины те же, что запрещают биндить временные объекты к неконстантной ссылке.
1
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
23.01.2015, 00:12 | 9 |
Нет такого запрета. Известно, что неконстантная ссылка не продлевает жизнь временного объекта.
Это означает, что ссылка будет недействительной. Тем не менее это даже работает. Вижал студия кричит ворнингами, но по удачному стечению обстоятельств трупы ещё даже протухнуть не успевают. В том, что касается данной ситуации: временный объект живой. Он не умрет, пока не завершится все выражение. В этом смысле проблем нет.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||||||||||||
23.01.2015, 01:08 | 10 | |||||||||||||||
Разве ограничения на такую привязку технические? Они чисто идеологические. Что собственно подтверждает нестандартное расширение студии, которое позволяет делать такую привязку. Стандарт, кстати, не запрещает продлевать время жизни по любой ссылке, как константной, так и неконстантной, но запрещает делать привязку к неконстантной.
Впрочем, если тебе хочется поспорить, то это мимо. Я не имею ни малейшего желания это делать и лишь высказал свое мнение. Если тебя оно не устраивает, предлагаю подождать других. Добавлено через 47 минут hoggy, во дела. Отвечал на один пост, а теперь вижу совсем другой. Мистика Ладно, наверное надо объяснить что я имел в виду. Рассмотрим вот такой код:
Теперь заменим A на int. Что изменилось? int - это не класс. И, я думаю, никто не будет спорить, что у int не может быть методов. Значит ++ по отношению к int - внешняя функция. И вот тут как раз вступает в силу упомянутый мной момент с const reference. Если operator++ по отношению к int внешняя функция, то ее прототип (псевдокод) будет выглядеть так:
Проделаем тоже самое с классом. Сделаем operator++, но уже внешней функцией
Я думаю все теперь на своих местах.
1
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
23.01.2015, 01:45 | 11 | |||||||||||||||
Не вижу проблемы.
Почему нельзя то??? С чем это связанно? Понятно, что если бы он это узаконил - можно было бы прострелить себе ногу, а компилятор бы даже ворнингом не пискнул.
Это ограничение просто не спасет:
Что бы там ни было, но причина явно не идеологическая.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
23.01.2015, 02:00 | 12 | |||||
Как мне кажется, на изначальный твой вопрос, о том чем int "хуже" чем класс, я ответил. Дальше уже нужно рассматривать почему таки нельзя биндить rvalue к неконстантной ссылке. Но это уже другой вопрос.
Добавлено через 12 минут Оно и не спасает. Все правильно. Я повторюсь, не хочу спорить по этому вопросу. Но мое мнение такое, что это заплатка именно идеологическая. Попытка хоть чуть-чуть внести контроль на уровне синтаксиса. Дело в том, что литерал - тоже rvalue, видимо поэтому решено было запретить биндинги к неконстантной ссылке для всех rvalue, чтобы не плодить лишних исключений из правил.
2
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
23.01.2015, 09:52 | 13 | |||||
Это было бы похоже на правду, если бы компилятор не умел различать константные rvalue от неконстантных.
Однако умеет. Более того: это не есть фича нового стандарта.
На самом деле это просто похоже на ещё один откровенный ляп в дизайне языка, на который и комитет, и сообщество тупо положили с прибором.
1
|
23.01.2015, 12:02 | 14 | ||||||||||||
Добавлено через 23 минуты
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
23.01.2015, 23:16 | 15 | |||||
эмммм, у последнего примера ошибка из-за вызова неконстантного метода у константного объекта.
вроде это не совсем по теме временных объектов. немного пользы для тех, кто не знаком с такой штукой: тут уже было сказано что неконстантная ссылка не продлевает жизнь объекту. а вот константная таки продлевает:
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
23.01.2015, 23:54 | 16 | ||||||||||
У вас тут UB
1
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
24.01.2015, 00:10 | 17 |
черт. опечатка вышла. ссылка при возврате из функции не предполагалась
0
|
24.01.2015, 00:10 | |
24.01.2015, 00:10 | |
Помогаю со студенческими работами здесь
17
Деструктор для встроенного типа Как создать шаблон для пользовательского и встроенного типа? Как присвоить переменной своего класса переменную встроенного типа "Анонимные" (временные) объекты? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
|
UserScript для подсветки кнопок языков программирования в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения:
/ / ==UserScript==
/ / @name CF_DefaultLangSelect
/ / . . .
|
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
|
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
|
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
|
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
|
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей
Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
|
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
|
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
|
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
|
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
|
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке
В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
|