Re: Аналог "discarding _" для С++
От: rg45 СССР  
Дата: 29.06.25 17:56
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте. В C# есть "discarding _", который по сути создаёт временный объект и возвращает для него ref, чтобы принимающая функция, кортеж или выражение могли благополучно в него написать и забыть. Как получить подобное поведение в С++? То есть чтобы некий довольно краткий синтаксис мог быть передан в любую функцию вместо параметра, принимающего не-константную ссылку? Например?

W>
W>// Что нужно написать вместо ..., чтобы работало нижнее?
W>void foo(int&);
W>foo(...);
W>... = 1;
W>[x, ...] = get_some_struct();
W>

W>Очевидно, что напрашивается функция, которая возвращает статическую переменную, объявленную внутри себя. Но в этом случае у нас получится один член на все вызовы, что чревато неожиданным поведением. Также не хотелось бы явно указывать тип аргумента, то есть discard() без <int> в конце, но это не обязательно. Также не хочется ничего на куче создавать без необходимости.

W>Ну и ограничение на стандарт — С++14. Какие могут быть варианты?


Ну как раз вот это и хреново, поскольку самым нормальным решением был бы переход от конкретных типов к концептам.

Ну а с озвученными ограничениями:

template <typename T>
T& lvalue(T&& t) {
  return t; // На C++23 не проканает - нужно будет использовать forward<T&>(t)
}

foo(lvalue(42));
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 29.06.2025 17:56 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.