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 не ссылка? И какой у нее тип
источник

A

Alex in pro.cxx
хочу поведение move для не const значений (не ссылок), и forward для всего остального
источник

A

Alex in pro.cxx
есть какой-нибуль трейт is_movable?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
При передаче в функцию любое главлуе будет лвалуе ссылкой
источник

A

Alex in pro.cxx
не понял, не ссылка не может сама собой стать ссылкой
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Трейтами не проверить валуев категорию, потому что она не тип
источник

A

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

AB

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

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Тогда я не понимаю, чем форвард не подходит
источник

A

Alex in pro.cxx
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
Делай ктор шаблоном
источник

A

Alex in pro.cxx
поэтому я вижу решение в виде новой функции, которая делает move если можно, и не делает ничего если нельзя (просто return аргумента)
источник

A

Alex in pro.cxx
Artöm Bakri Al-Sarmini
Делай ктор шаблоном
Не понял идею
источник

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, но если аргумент изначально ссылка - это не работает
Invokable может быть ссылкой?
источник

A

Alex in pro.cxx
нет, аргументы operator() могут быть ссылками
источник

A

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

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Ну так, нет конструктора от Invokable&
источник

A

Alex in pro.cxx
он и не нужен, это специально, к Invokable и конструктору вопросов нет
источник

A

Alex in pro.cxx
void operator()(Args... args) const override
 {
   _invokable(std::move(args)...);
 }
источник

A

Alex in pro.cxx
вот здесь должен быть не move
источник