Сообщение Re[3]: Аналог "discarding _" для С++ от 30.06.2025 6:27
Изменено 30.06.2025 7:03 rg45
Re[3]: Аналог "discarding _" для С++
Здравствуйте, Went, Вы писали:
W>Ничего не понял. У меня задача не получить lvalue из чего угодно, а сгенерировать временный lvalue-объект, уникальный для каждого вызова. То есть, чтобы было что-то наподобие
W>
W>Но в идеале без <int> (хотя это вряд ли достижимо без граблей) и с минимальным оверхедом по синтаксису и производительности.
Да я понял, что тебе нужно. Просто идеального дискардинга, как в C# не получается. Например, приведенный тобой вариант будет работать только для типов с дефолтным конструктором (в дополнение к необходимости явной спецификации типа). Вариант с lvalue просто позволяет сконструировать налету временный объект любого конструируемого типа и передать его в функцию по lvalue ссылке. Синтаксического сахара, конечно, меньше, чем в C#. Зато получается настоящий временный объект (не на куче и не в статике), который умрет в конце полного выражения или инициализатора. Также охватываются типы, для которых отсутсвует возможность конструирования по дефолту. Это и оптимизироваться должно хорошо, поскольку компилятору прекрасно видно, что это объект "навыброс".
P.S. А вообще аутпут параметрами лучше не злоупотреблять. С ними обязательно какой-нибудь геморрой — не такой, так эдакий.
W>Ничего не понял. У меня задача не получить lvalue из чего угодно, а сгенерировать временный lvalue-объект, уникальный для каждого вызова. То есть, чтобы было что-то наподобие
W>
W>foo(discard<int>())
W>W>Но в идеале без <int> (хотя это вряд ли достижимо без граблей) и с минимальным оверхедом по синтаксису и производительности.
Да я понял, что тебе нужно. Просто идеального дискардинга, как в C# не получается. Например, приведенный тобой вариант будет работать только для типов с дефолтным конструктором (в дополнение к необходимости явной спецификации типа). Вариант с lvalue просто позволяет сконструировать налету временный объект любого конструируемого типа и передать его в функцию по lvalue ссылке. Синтаксического сахара, конечно, меньше, чем в C#. Зато получается настоящий временный объект (не на куче и не в статике), который умрет в конце полного выражения или инициализатора. Также охватываются типы, для которых отсутсвует возможность конструирования по дефолту. Это и оптимизироваться должно хорошо, поскольку компилятору прекрасно видно, что это объект "навыброс".
P.S. А вообще аутпут параметрами лучше не злоупотреблять. С ними обязательно какой-нибудь геморрой — не такой, так эдакий.
Re[3]: Аналог "discarding _" для С++
Здравствуйте, Went, Вы писали:
W>Ничего не понял. У меня задача не получить lvalue из чего угодно, а сгенерировать временный lvalue-объект, уникальный для каждого вызова. То есть, чтобы было что-то наподобие
W>
W>Но в идеале без <int> (хотя это вряд ли достижимо без граблей) и с минимальным оверхедом по синтаксису и производительности.
Да я понял, что тебе нужно. Просто идеального дискардинга, как в C# не получается. Например, приведенный тобой вариант будет работать только для типов с дефолтным конструктором (в дополнение к необходимости явной спецификации типа). Вариант с lvalue просто позволяет сконструировать налету временный объект любого конструируемого типа и передать его в функцию по lvalue ссылке. Синтаксического сахара, конечно, меньше, чем в C#. Зато получается настоящий временный объект (не на куче и не в статике), который умрет в конце полного выражения или инициализатора. Это должно хорошо поддаваться оптимизации, поскольку компилятору прекрасно видно, что это объект "навыброс". Также охватываются типы, для которых отсутсвует возможность конструирования по дефолту (или для вызываемой функции не пофигу, с какими параметрами сконструирован объект).
P.S. А вообще аутпут параметрами лучше не злоупотреблять. С ними обязательно какой-нибудь геморрой — не такой, так эдакий.
W>Ничего не понял. У меня задача не получить lvalue из чего угодно, а сгенерировать временный lvalue-объект, уникальный для каждого вызова. То есть, чтобы было что-то наподобие
W>
W>foo(discard<int>())
W>W>Но в идеале без <int> (хотя это вряд ли достижимо без граблей) и с минимальным оверхедом по синтаксису и производительности.
Да я понял, что тебе нужно. Просто идеального дискардинга, как в C# не получается. Например, приведенный тобой вариант будет работать только для типов с дефолтным конструктором (в дополнение к необходимости явной спецификации типа). Вариант с lvalue просто позволяет сконструировать налету временный объект любого конструируемого типа и передать его в функцию по lvalue ссылке. Синтаксического сахара, конечно, меньше, чем в C#. Зато получается настоящий временный объект (не на куче и не в статике), который умрет в конце полного выражения или инициализатора. Это должно хорошо поддаваться оптимизации, поскольку компилятору прекрасно видно, что это объект "навыброс". Также охватываются типы, для которых отсутсвует возможность конструирования по дефолту (или для вызываемой функции не пофигу, с какими параметрами сконструирован объект).
P.S. А вообще аутпут параметрами лучше не злоупотреблять. С ними обязательно какой-нибудь геморрой — не такой, так эдакий.