Size: a a a

2020 December 16

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
А есть в std функция, которая сделает move, если аргумент lvalue (или rvalue reference), и просто передаст дальше, если lvalue ссылка? Типа forward, но с добавлением случая для lvalue.
Lvalue ссылка это lvalue
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
А есть в std функция, которая сделает move, если аргумент lvalue (или rvalue reference), и просто передаст дальше, если lvalue ссылка? Типа forward, но с добавлением случая для lvalue.
Форвард как раз мувает лвалуе не ссылки
источник

A

Alex in pro.cxx
Может, я что-то не так понял о той ошибке компиляции, которую сейчас получаю, поэкспериментирую в godbolt
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
template <class Invokable, typename... Args>
struct Functor final : ... {
 explicit Functor(Invokable&& invokable) : _invokable{ std::move(invokable) }
 {}

 void operator()(Args... args) const override
 {
   _invokable(std::move(args)...);
 }

private:
 const Invokable _invokable;
};


Есть вот такой код, он принимает копии аргументов и делает move, но если аргумент изначально ссылка - это не работает
Нет, он может принимать и по ссылке. Работа для форварда как раз
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
насколько я понимаю, мне и не нужно проверять категорию, потому что если тип не конст и не ссылка - можно мувать
Забудь, это я думал об универсальных ссылках, которых тут нет
источник

A

Alex in pro.cxx
да, здесь все аргументы - просто значения, но тип значения может быть и ссылкой
источник

A

Alex in pro.cxx
Сделал пример. Я правильно понимаю, что я могу решить проблему, написав правильную функцию вместо std::move?
https://godbolt.org/z/1dr4GP
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
Сделал пример. Я правильно понимаю, что я могу решить проблему, написав правильную функцию вместо std::move?
https://godbolt.org/z/1dr4GP
источник

A

Alex in pro.cxx
не открывается
Я набросал вот такое https://godbolt.org/z/W6KWKd
источник

A

Alex in pro.cxx
о, спасибо, вижу
источник

A

Alex in pro.cxx
а оно точно делает то, что надо? Я посмотрел реализацию forward, и мне так не показалось
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Накидай примеры шаблонных аргументов, где должен и не должен произойти мув
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Форвард делает мув всего, кроме лвалуе ссылок
источник

A

Alex in pro.cxx
Т. е. так должно компилиться и работать без копирования?
void g(std::vector<int>&&);

void f(std::vector<int> v)
{
  g(std::forward<decltype(v)>(v);
}
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Первая g?
источник

A

Alex in pro.cxx
да, сорри)
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Да, это работает
источник

A

Alex in pro.cxx
Большое спасибо, пойду опять почитаю cppref про forward, поищу, что я не так понял
источник

A

Alex in pro.cxx
я думал, её вообще не стоит использовать с параметрами, которые не являются forwarding ссылками
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
В твоем случае можно
источник