Информация об изменениях

Сообщение Re[4]: Аналог "discarding _" для С++ от 30.06.2025 7:27

Изменено 30.06.2025 7:38 rg45

Re[4]: Аналог "discarding _" для С++
Здравствуйте, so5team, Вы писали:

S>Самое простое, что сразу приходит в голову:

S>
S>template<typename T>
S>struct discarding_arg
S>{
S>    T _tmp;

S>public:
S>    operator T&() &&
S>    {
S>        return _tmp;
S>    }
S>};

S>void f(int & i) {
S>    i = 0;
S>}

S>int main()
S>{
S>    f(discarding_arg<int>{});
S>}
S>



Как вариант:

template<typename T>
T& discarding_arg (T&& _tmp = T{})
{
  return std::forward<T&>(_tmp); // До C++23 просто return _tmp;
}

void f(int & i) {
    i = 0;
}

int main()
{
    // Вариантов использования появляется чуть больше:
    f(discarding_arg<int>());
    f(discarding_arg(42));
    g(discarding_arg(std::vector(1, 2, 3)));
}


Только если присмотреться, окажется, что discarding_arg — это переименованный lvalue
Автор: rg45
Дата: 29.06.25
Re[4]: Аналог "discarding _" для С++
Здравствуйте, so5team, Вы писали:

S>Самое простое, что сразу приходит в голову:

S>
S>template<typename T>
S>struct discarding_arg
S>{
S>    T _tmp;

S>public:
S>    operator T&() &&
S>    {
S>        return _tmp;
S>    }
S>};

S>void f(int & i) {
S>    i = 0;
S>}

S>int main()
S>{
S>    f(discarding_arg<int>{});
S>}
S>



Как вариант:

template<typename T>
T& discarding_arg (T&& _tmp = T{})
{
  return std::forward<T&>(_tmp); // До C++23 можно просто "return _tmp;"
}

void f(int & i) {
    i = 0;
}

int main()
{
    // Вариантов использования появляется чуть больше:
    f(discarding_arg<int>());
    f(discarding_arg(42));
    g(discarding_arg(std::vector(1, 2, 3)));
}


Только если присмотреться, окажется, что discarding_arg — это переименованный lvalue
Автор: rg45
Дата: 29.06.25