с помощью этой лекции:
https://youtu.be/oQDOqB1asNw
(2-5 минуты введут в контекст, но можно и без этого понять суть вопроса)
Для более глубокого понимания данной темы решил разобраться с временными объектами.
Вот один из взглядов на это:
https://docs.microsoft.com/ru-ru/cpp/cpp/temporary-objects?view=msvc-160
В указанной выше статье есть 3 пункта с причинами создания временных объектов:
1.(непонятно) Для сохранения результата приведения к пользовательскому типу. Когда объект заданного типа явно преобразуется в пользовательский тип, этот новый объект создается как временный. (Почему «этот новый объект создаётся как временный»?)
2.(непонятно) Для инициализации const ссылки с инициализатором типа, отличного от базового типа для инициализированной ссылки. (Тут речь о неявном преобразовании в процессе?)
3.(непонятно) Для сохранения возвращаемого значения функции, которая возвращает пользовательский тип. Эти временные объекты создаются только в том случае, если программа не копирует возвращаемое значение в объект. (Что значит «если программ не копирует …»? Примеры с копированием и без внесли бы ясность?).
Спасибо
Простите, а в чём вопрос? И если речь идёт о временных объектах, нужно брать материал 17 стандарта
Там 3 вопроса Непонятны сами случаи, когда что-то является временным объектом
Мне не очень понятно выражение "являться временным объектом"
И мне также В лекции регулярно используется это словосочетание Через него лектор выражает суть разного типа ссылок
Возможно, автор на самом деле говорит о категориях значений
1) есть выражение, в нём надо сделать приведение типа для вычисления выражения. Для этого компилятор должен создать временный объект целевого типа. Других вариантов вообще нет. 2) Тут то же самое что (1) , только этот временный объект ещё и решили поименовать. Это кстати абсолютно дурацкий стиль кода, но С++ его , как видишь, поддерживает (и ничего плохого не будет без const_cast) 3. В случае если объект возврата из фукнции копируется куда-то, то через RVO объект возврата может быть сразу же помещён в целевую переменную. Но может и НЕ быть помещён, тогда будет требоваться временный объект. Тут видимо твои лекции не до конца точны, ибо RVO всегда является опциональным, оно может не применяться.
Спасибо, всё понял Интересно, что в 3 случае может быть два варианта
В данном контексте что можно сказать про алиасинг? Пользовался либой в которой выражение A = B + C всегда сначала создавался временный обьект, так как возможно выражение A = A + C, а при операции A + C размер A мог измениться
Почему возможность описанную во втором пункте называете дурацкой? Какие неприятности от этого можно получить? В пункте 3, вы все верно пишите, просто я скинул не весь фрагмент, оригинал: «Для сохранения возвращаемого значения функции, которая возвращает пользовательский тип. Эти временные объекты создаются только в том случае, если программа не копирует возвращаемое значение в объект.» Что касается temporary object, понравилась эта статья (пункт Temporary object lifetime) https://en.cppreference.com/w/cpp/language/lifetime
Неприятностей никаких. Но тут типа ты хотел как бы переменную получить, а получаешь временную константу.... Я никогда в жизни такого кода, наверное, не видел. Скорее всего, такое только случайно в шаблонном коде может быть получено. Потому что там неизвестно, из какого типа в какой тип ты хочешь преобразовывать — это может определяться при инстанциировании шаблона, пользователем.
Обсуждают сегодня