Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137

Создание новой локальной переменной

27.12.2015, 23:22. Показов 3037. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда мы приводим переменную к другому типу, ВСЕГДА СОЗДАЕТСЯ новая локальная временная переменная этого типа?
C++
1
2
3
4
enum class NUMBERS{ONE, TWO};
std::size_t a = static_cast<int>(NUMBERS::ONE);
//Тут создается сначала временная локальная переменная типа int?
//Затем создается локальная временная переменная типа std::size_t?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2015, 23:22
Ответы с готовыми решениями:

Создание Новой переменной!
Помогите написать фрагмент кода задача в том что: Ну жно создать переменную char с именим веденным с клавы!

Возвращение адреса локальной переменной
Такой код выводит в консоль 5. Разве переменная a не должна уничтожиться после того, как отработала функция и вернуть ссылку на пустую...

Использование неинициализированной локальной переменной
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; using namespace std; ...

38
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.12.2015, 19:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Следовательно мой ответ верный - в результате cast conversion всегда будет новая временная переменная.
Не знаю исходя их чего ты сделал такой вывод. Это не так на мой взгляд.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
30.12.2015, 15:53
Цитата Сообщение от castaway Посмотреть сообщение
Не знаю исходя их чего ты сделал такой вывод.
Выше дали цитату из стандарта, которая очень четко это определяет. Вот она:
Цитата Сообщение от ct0r Посмотреть сообщение
The result of the expression (T) cast-expression is of type T. The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type; otherwise the result is a prvalue.
Выделил ключевое.
Однако создание временного объекта действительно происходит не всегда. В выделенной фразе про это тоже есть: если у нас идет речь о ссылках.
Другое дело, что наблюдаемый эффект может не соответствовать этому, т.к. компилятор (все так же в соответствии со стандартом) может проводить copy-elision оптимизацию и исключать появление временного объекта. Однако первое правило первично. Недавно была тема про конструктор копирования, который компилятор требует иметь доступным, несмотря на то, что в результирующем коде его вызова нет.

Добавлено через 50 секунд
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
всегда будет новая временная переменная
Вообще действительно не всегда. См. выше
4
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.12.2015, 16:51
Цитата Сообщение от DrOffset Посмотреть сообщение
т.к. компилятор (все так же в соответствии со стандартом) может проводить copy-elision оптимизацию и исключать появление временного объекта
А причем тут оно? copy elision - единственная оптимизация, которая может забить на side-effects. А при касте, если у нас в классе есть что-то side-effects нетривиальное, то никакая оптимизация не выкинет временный объект даже из строки static_cast<Foo>(foo);
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
30.12.2015, 17:08
ct0r, это ты что-то свое подумал. Я не говорил, что copy-elision работает при любом касте, я просто привел пример, когда временный объект убирается из цепочки преобразований законным путем.
Обрати внимание - это новый абзац. Новая мысль.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.12.2015, 19:10
Цитата Сообщение от DrOffset Посмотреть сообщение
Выше дали цитату из стандарта, которая очень четко это определяет.
Ну так я об этом и говорю. Он сделал вывод что временная переменная создаётся всегда, а я возразил, о чём, собственно, и писал в начале темы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.12.2015, 23:10
Цитата Сообщение от castaway Посмотреть сообщение
Он сделал вывод что временная переменная создаётся всегда, а я возразил, о чём, собственно
хз, как вам ещё это можно донести.
вы ни русский, ни английский похоже не воспринимаете.

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

правила языка первичны, оптимизации - вторичны.

именно поэтому,
компилятор требует конструктор копии,
даже если в результирующем коде он не используется,
потому что компилятор оптимизировал промежуточные значения.
0
31.12.2015, 00:26

Не по теме:

Croessmah, satyr

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.12.2015, 13:48
Цитата Сообщение от hoggy Посмотреть сообщение
хз, как вам ещё это можно донести.
Ну раз не знаете, так не доносите. Я холивар не люблю.

Цитата Сообщение от hoggy Посмотреть сообщение
формально временный объект создается всегда.
Формально, временный объект всегда не создаётся.

Пример:
C++
1
2
    float f = 123.456f;
    int i = static_cast<int>( f );
Как формально, так и фактически (на x86) тут нет временной переменной.

hoggy, ответьте мне на один вопрос, где по-вашему создаётся эта временная переменная, если я её не вижу ни в исходном коде, ни в дизассемблере?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 13:59
Цитата Сообщение от castaway Посмотреть сообщение
Как формально
создается

Цитата Сообщение от castaway Посмотреть сообщение
ни в дизассемблере
правила языка первичнее.
оптимизации вторичнее.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.12.2015, 14:28
hoggy, вы понимаете значение слова "формально"? Где вы видите что формально она создаётся?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.12.2015, 15:45
Цитата Сообщение от hoggy Посмотреть сообщение
в стандарте с++
В коде вы это видите?

Добавлено через 6 минут
Любой компилятор создаёт кучу временных переменных во время работы. Логично предположить, что ТС подразумевает фактическое создание временных переменных.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 17:08
Цитата Сообщение от castaway Посмотреть сообщение
В коде вы это видите?
разумеется.

C++
1
get_worker().work(); //<--- а вы его видите?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// а здесь видите?
const widget root = widget::create<window>("example")
    .width(200)
    .heigth(100)
    .label("hello, world")
    .add<text_box>
        .width(0.5)
        .heigth(0.5)
        .label("example text")
    .done()
.done();
 
root.chow();

Цитата Сообщение от castaway Посмотреть сообщение
что ТС подразумевает фактическое создание временных переменных.
в своих ответах выше я писал: что формально да, создаются.
но по факту компилятор все это дело прекрасно оптимизирует.

Цитата Сообщение от castaway Посмотреть сообщение
все ваши доводы и развёрнутые ответы пусты, и вводят людей в заблуждение.
один из моих доводов был: стандарт языка с++.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.12.2015, 19:10
Цитата Сообщение от hoggy Посмотреть сообщение
разумеется.
C++
1
get_worker().work(); //<--- а вы его видите?
Я вам не верю. Более того, вы далеко ушли от изначального вопроса.

Цитата Сообщение от hoggy Посмотреть сообщение
в своих ответах выше я писал: что формально да, создаются.
но по факту компилятор все это дело прекрасно оптимизирует.
Я читал что вы писали, и я в упор не вижу где они формально создаются.
Вы либо не понимаете значение слова "формально", либо намеренно вводите нас в заблуждение.

Цитата Сообщение от hoggy Посмотреть сообщение
один из моих доводов был: стандарт языка с++.
мне не интересно мнение человека,
который полагает стандарт языка пустым доводом.
и называет самую обычную автоматическую переменную
временным объектом.
Вы мнимательно читали параграф 12.2? Знаете что такое классовй тип?

Знаете поговорку: "Меньше слов, больше дела."?
Вместо того, чтобы ответить кратко и ясно, вы даёте размытый ответ на пол страницы, который далеко не всегда соответствует действительности.
Пересмотрите свой подход к ответам.

Добавлено через 4 минуты
Изначальный вопрос на всякий случай.
Цитата Сообщение от notemac Посмотреть сообщение
Когда мы приводим переменную к другому типу, ВСЕГДА СОЗДАЕТСЯ новая локальная временная переменная этого типа?
0
31.12.2015, 21:13

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
3
4
const widget root = widget::create<window>("example")
.width(200)
.heigth(100)
.label("hello, world")
Красиво :bravo:
Qt до такого дошел или что-то совершенно новое?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.01.2016, 01:28
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Qt до такого дошел или что-то совершенно новое?
это не qt,а моя собственная приблуда.

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

суть проста: многие методы разных классов возвращают *this
что позволяет "декларативное программирование".

добавляем возможность организовать данные в виде дерева,
и вуаля!
3
01.01.2016, 02:03

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
суть проста: многие методы разных классов возвращают *this
что позволяет "декларативное программирование".
hoggy, похоже еще и на ФП. Что-то подобное когда-то хотели для WPF сделать, вместо XAML, но не знаю, насколько в этом преуспели.
В любом случае выглядит круто

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.01.2016, 14:02
Цитата Сообщение от hoggy Посмотреть сообщение
многие методы разных классов возвращают *this
Данный подход описан в D&E как альтернатива именованным аргументам.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.01.2016, 04:09
Цитата Сообщение от Tulosba Посмотреть сообщение
D&E
что это?
0
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
02.01.2016, 05:12  [ТС]
hoggy, The Design and Evolution of C++, наверное.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2016, 05:12

Возвращение адреса локальной переменной
Добрый день! Нужна функция читающая из файла разные медиа-данные в память. Размер заранее неизвестен, поэтому сразу память выделить,...

Разрушение стека около локальной переменной
В функции имеется такая строка char target=&quot;&quot;; Все работает хорошо, но при выходе из подпрограммы пишет &quot;Stack around the variable...

Как назначить имя новой переменной в new
Здравствуйте, 1)Функция должна создавать новый объект структуры. struct Wagen { int weight;; char clas; }; Функция: void...

Как объявить имя новой переменной в new
Здравствуйте, 1)Функция должна создавать новый объект структуры : struct Wagen { int weight;; char clas; };

Добавление новой переменной для умножения
Имеется кусок программы : #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cmath&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru