Сообщение Re: Аналог "discarding _" для С++ от 29.06.2025 17:56
Изменено 29.06.2025 17:56 rg45
Re: Аналог "discarding _" для С++
Здравствуйте, Went, Вы писали:
W>Здравствуйте. В C# есть "discarding _", который по сути создаёт временный объект и возвращает для него ref, чтобы принимающая функция, кортеж или выражение могли благополучно в него написать и забыть. Как получить подобное поведение в С++? То есть чтобы некий довольно краткий синтаксис мог быть передан в любую функцию вместо параметра, принимающего не-константную ссылку? Например?
W>
W>Очевидно, что напрашивается функция, которая возвращает статическую переменную, объявленную внутри себя. Но в этом случае у нас получится один член на все вызовы, что чревато неожиданным поведением. Также не хотелось бы явно указывать тип аргумента, то есть discard() без <int> в конце, но это не обязательно. Также не хочется ничего на куче создавать без необходимости.
Ну и ограничение на стандарт — С++14. Какие могут быть варианты?
Ну как раз вот это и хреново, поскольку самым нормальным решением был бы переход от конкретных типов к концептам.
Ну а с озвученными ограничениями:
W>Здравствуйте. В C# есть "discarding _", который по сути создаёт временный объект и возвращает для него ref, чтобы принимающая функция, кортеж или выражение могли благополучно в него написать и забыть. Как получить подобное поведение в С++? То есть чтобы некий довольно краткий синтаксис мог быть передан в любую функцию вместо параметра, принимающего не-константную ссылку? Например?
W>
W>// Что нужно написать вместо ..., чтобы работало нижнее?
W>void foo(int&);
W>foo(...);
W>... = 1;
W>[x, ...] = get_some_struct();
W>W>Очевидно, что напрашивается функция, которая возвращает статическую переменную, объявленную внутри себя. Но в этом случае у нас получится один член на все вызовы, что чревато неожиданным поведением. Также не хотелось бы явно указывать тип аргумента, то есть discard() без <int> в конце, но это не обязательно. Также не хочется ничего на куче создавать без необходимости.
Ну и ограничение на стандарт — С++14. Какие могут быть варианты?
Ну как раз вот это и хреново, поскольку самым нормальным решением был бы переход от конкретных типов к концептам.
Ну а с озвученными ограничениями:
template <typename T>
T& lvalue(T&& t) {
return t; // На C++23 не проканает - нужно будет использовать forward<T&>(t)
}
foo(lvalue(42));Re: Аналог "discarding _" для С++
Здравствуйте, Went, Вы писали:
W>Здравствуйте. В C# есть "discarding _", который по сути создаёт временный объект и возвращает для него ref, чтобы принимающая функция, кортеж или выражение могли благополучно в него написать и забыть. Как получить подобное поведение в С++? То есть чтобы некий довольно краткий синтаксис мог быть передан в любую функцию вместо параметра, принимающего не-константную ссылку? Например?
W>
W>Очевидно, что напрашивается функция, которая возвращает статическую переменную, объявленную внутри себя. Но в этом случае у нас получится один член на все вызовы, что чревато неожиданным поведением. Также не хотелось бы явно указывать тип аргумента, то есть discard() без <int> в конце, но это не обязательно. Также не хочется ничего на куче создавать без необходимости.
W>Ну и ограничение на стандарт — С++14. Какие могут быть варианты?
Ну как раз вот это и хреново, поскольку самым нормальным решением был бы переход от конкретных типов к концептам.
Ну а с озвученными ограничениями:
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));