??? }
};
как правильно внутри такой конструкции форвардить аргументы? мне кажется, ни forward<T>, ни move не дадут ожидаемого результата.
для A<B>::f хочу мувать аргумент, для A<const B&>::f передавать по ссылке далее
template <class T> struct A { template <same_as<T> T_> void f(T_&& arg) { ... } }; ?
нет, метод не должен быть шаблонным, у него строго зафиксированы аргументы
так они не выведутся
А что не так с форвардом?
я его использовал только в контексте T&&, поэтому сомневаюсь
Точно так же принимаем T&&. В таком случае, сжатие ссылок должно работать всё ещё правильно
А, это нормально, просто сопоставь табличку.
да нельзя принимать T&&, потому что тогда для A<int> сигнатура метода будет void f(int&&)
Может, что-то такое? template <class T> using try_add_ref = typename std::conditional<std::is_reference_v<T>, T&&, T>::type; template <class T> struct A { void f(try_add_ref<T> arg) { } };
какой смысл от этой конструкции?
Для ссылочных аргументов мы принимаем тип по форвард-ссылке, получая при сжатии ссылок либо lvalue, либо rvalue ref, для нессылочных типов принимаем по значению
принимать мне нужно именно T в том виде, в котором я прописал в шаблоне класса (если будет проще: template <class... Args> struct func { void operator()(Args...); }, просто потом нужно: T -> T&& T& -> T& const T& -> const T& T&& -> T&&, где T - не forwarding ref, а конкретный тип
Вроде если ты тут форвард сделаешь всё збс будет
Вроде бы, всё правильно За исключением того, что пришлось бороться с copy elision странным образом
Обсуждают сегодня