Re[3]: Аналог "discarding _" для С++
От: rg45 СССР  
Дата: 30.06.25 06:27
Оценка:
Здравствуйте, Went, Вы писали:

W>Ничего не понял. У меня задача не получить lvalue из чего угодно, а сгенерировать временный lvalue-объект, уникальный для каждого вызова. То есть, чтобы было что-то наподобие

W>
W>foo(discard<int>())
W>

W>Но в идеале без <int> (хотя это вряд ли достижимо без граблей) и с минимальным оверхедом по синтаксису и производительности.

Да я понял, что тебе нужно. Просто идеального дискардинга, как в C# не получается. Например, приведенный тобой вариант будет работать только для типов с дефолтным конструктором (в дополнение к необходимости явной спецификации типа). Вариант с lvalue просто позволяет сконструировать налету временный объект любого конструируемого типа и передать его в функцию по lvalue ссылке. Синтаксического сахара, конечно, меньше, чем в C#. Зато получается настоящий временный объект (не на куче и не в статике), который умрет в конце полного выражения или инициализатора. Это должно хорошо поддаваться оптимизации, поскольку компилятору прекрасно видно, что это объект "навыброс". Также охватываются типы, для которых отсутсвует возможность конструирования по дефолту (или для вызываемой функции не пофигу, с какими параметрами сконструирован объект).

P.S. А вообще аутпут параметрами лучше не злоупотреблять. С ними обязательно какой-нибудь геморрой — не такой, так эдакий.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.06.2025 7:03 rg45 . Предыдущая версия . Еще …
Отредактировано 30.06.2025 6:53 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:49 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:42 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:38 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:35 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:34 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:29 rg45 . Предыдущая версия .
Отредактировано 30.06.2025 6:28 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.